regex - 避免在正则表达式中转义字符

标签 regex python-3.x escaping backslash

我正在处理 POST 正文的内容,并希望提取每个键的值。我试图解析的数据是:

s = b'----------------------------941135026682458398564529\r\nContent-Disposition: form-data; name="username"\r\n\r\nmyusername\r\n----------------------------941135026682458398564529\r\nContent-Disposition: form-data; name="password"\r\n\r\nmypassword\r\n----------------------------941135026682458398564529\r\nContent-Disposition: form-data; name="keyword"\r\n\r\nmykeyword\r\n----------------------------941135026682458398564529--\r\n'

我想要得到的是值myusername , mypasswordmykeyword通过使用Python的re模块。因此我生成了这个模式:

pattern = r'\bname=\"{}\"\\r\\n\\r\\n([^-]+)\\r'      

然后根据需要进行修改以匹配每个键:

username_pattern = re.compile(pattern.format("username"))                                      
password_pattern = re.compile(pattern.format("password"))                      
keyword_pattern = re.compile(pattern.format("keyword")) 

我面临的问题是所有反斜杠都被转义了,所以当我定义 pattern 时,而不是保留之前定义的值,我得到每个反斜杠转义:

'\\bname=\\"{}\\"\\\\r\\\\n\\\\r\\\\n([^-]+)\\\\r'

然后,当我运行 <any of the compiled patterns>.search(s) 时方法没有匹配项。我已经测试了模式 here它对每个关键字都按预期工作。如何避免这个反斜杠转义?而且,如果我的要求没有必要,我做错了什么?

最佳答案

原始字符串仅影响文字的解析方式。字符串对象无法记住您到底输入了什么,因此当它向您显示反斜杠转义时,它会向您显示非原始文字是什么。

这三个是等效的:

>>> re.compile('\r', re.DEBUG)
LITERAL 13
>>> re.compile('\\r', re.DEBUG)
LITERAL 13
>>> re.compile(r'\r', re.DEBUG)
LITERAL 13

但这不是:

>>> re.compile(r'\\r', re.DEBUG)
LITERAL 92
LITERAL 114

关于regex - 避免在正则表达式中转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43002591/

相关文章:

Python: map 类在静态范围内的功能

php - 我在 postgresql 中的表正在截断这些字符串

javascript - 将 HTML 从 Controller 传递到 Javascript 的正确方法是什么?

java - 从字符串中删除所有出现的\

Java 正则表达式匹配基本多语言平面之外的字符

java - 在 Java 中的单词之间查找文本

正则表达式 - 查找 2000 到 3000 之间的数字

Python,复杂的正则表达式解析器

python - 如何使用不确定条或等价物创建 3D 曲面图?

python - Selenium 无法使用正确的 chromedriver 版本和 chrome 版本