Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 避免在正则表达式中转义字符_Regex_Python 3.x_Escaping_Backslash - Fatal编程技术网

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就是这样。谢谢你指出这一点。添加您的评论作为答案。