【问题标题】:Avoid escaping characters in regex避免在正则表达式中转义字符
【发布时间】:2017-08-17 13:47:02
【问题描述】:

我正在处理 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 的 re 模块获得值 myusernamemypasswordmykeyword。出于这个原因,我生成了这个模式:

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

【问题讨论】:

  • r'\bname="{}"\r\n\r\n([^-]+)\r' 也应该可以工作。不要过度使用反斜杠,你已经在使用 raw 了。
  • @Jean-FrançoisFabre 就是这样。感谢您指出。添加您的评论作为答案。

标签: regex python-3.x escaping backslash


【解决方案1】:

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

这三个是等价的:

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

【讨论】:

    【解决方案2】:

    您已经在使用 raw 前缀。所以不需要双重转义\r\n 否则它们将被按字面意思理解(正则表达式接受文字\n\\n)。所以唯一的问题仍然是您需要传递为raw\b 字符:

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

    不带raw的替代方案:

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

    通过那些我得到与您的字符串匹配的内容(当我将其用作字符串时,而不是字节)

    【讨论】:

      猜你喜欢
      • 2012-02-07
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多