Regex 避免在正则表达式中转义字符
我正在处理帖子正文的内容,希望提取每个键的值。我试图分析的数据是:Regex 避免在正则表达式中转义字符,regex,python-3.x,escaping,backslash,Regex,Python 3.x,Escaping,Backslash,我正在处理帖子正文的内容,希望提取每个键的值。我试图分析的数据是: s = b'----------------------------941135026682458398564529\r\nContent-Disposition: form-data; name="username"\r\n\r\nmyusername\r\n----------------------------941135026682458398564529\r\nContent-Disposition: form-dat
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的re
模块获得值myusername
、mypassword
和mykeyword
。因此,我生成了以下模式:
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"))
我面临的问题是,所有反斜杠都被转义,因此当我定义模式时,不是保留先前定义的值,而是得到每个转义的反斜杠:
'\\bname=\\"{}\\"\\\\r\\\\n\\\\r\\\\n([^-]+)\\\\r'
然后,当我运行时,它会像预期的那样处理每个关键字。如何避免此反斜杠转义?如果我问的不是必须的,我做错了什么?高级感谢。原始字符串只影响文本的解析方式。string对象无法准确记住您键入的内容,因此当它向您显示反斜杠转义时,它将向您显示非原始文本的内容
这三者相当:
>>> 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
您已经在使用raw
前缀。因此无需双重转义\r
或\n
,否则它们将被逐字理解(regex接受literal\n
或\\n
)。因此,唯一的问题仍然是作为raw
传递的\b
字符:
pattern = r'\bname="{}"\r\n\r\n([^-]+)\r'
不带原始的备选方案
:
pattern = '\\bname="{}"\r\n\r\n([^-]+)\r'
与您的字符串匹配(当我将其用作字符串而不是字节时)r'\bname=“{}”\r\n\r\n([^-]+)\r'
也应该可以。不要过度使用反斜杠,你已经在使用生的了。@Jean-Françoisfare就是这样。谢谢你指出这一点。添加您的评论作为答案。