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

时间:2017-03-24 14:50:55

标签: 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'

我希望通过使用Python的myusername模块获得值mypasswordmykeywordre。出于这个原因,我生成了这种模式:

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进行了测试,并且每个关键字都按预期工作。如何避免这种反斜杠转义?而且,如果我所要求的不是必要的,我做错了什么?谢谢你提前。

2 个答案:

答案 0 :(得分:2)

原始字符串仅影响文字的解析方式。字符串对象无法记住您输入的内容,因此当它向您显示反斜杠时,它会向您显示非原始字面值。

这三个是等价的:

>>> 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

答案 1 :(得分:1)

您已使用raw前缀。所以不需要双重逃避\r\n或者他们将被逐字逐句(正则表达式接受文字\n\\n)。因此,唯一的问题仍然是\b字符,您需要传递为raw

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

替代没有raw

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

用那些我得到你的字符串匹配(当我用它作为字符串,而不是字节)