[英]Avoid escaping characters in regex
我正在使用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
模塊的值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"))
我面臨的問題是所有的反斜杠都被轉義,所以當我定義pattern
,不是保留先前定義的值,而是每個反斜杠都會被轉義 :
'\\bname=\\"{}\\"\\\\r\\\\n\\\\r\\\\n([^-]+)\\\\r'
然后,當我運行<any of the compiled patterns>.search(s)
方法時,沒有匹配項。 我在這里測試了模式,它與每個關鍵字一起按預期工作。 如何避免這種反斜杠轉義? 而且,如果我所要求的不是必要的,我做錯了什么? 提前致謝。
原始字符串僅影響解析文字的方式。 字符串對象無法記住您輸入的內容,因此當它向您顯示反斜杠時,它會向您顯示非原始文字的內容。
這三個是等價的:
>>> 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
或者它們將被逐字逐句(正則表達式接受文字\\n
或\\\\n
)。 所以唯一的問題仍然是你需要以raw
方式傳遞的\\b
char:
pattern = r'\bname="{}"\r\n\r\n([^-]+)\r'
替代沒有raw
:
pattern = '\\bname="{}"\r\n\r\n([^-]+)\r'
那些我得到你的字符串匹配(當我用它作為字符串,而不是字節)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.