簡體   English   中英

避免在正則表達式中轉義字符

[英]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模塊的值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)方法時,沒有匹配項。 我在這里測試了模式,它與每個關鍵字一起按預期工作。 如何避免這種反斜杠轉義? 而且,如果我所要求的不是必要的,我做錯了什么? 提前致謝。

原始字符串僅影響解析文字的方式。 字符串對象無法記住您輸入的內容,因此當它向您顯示反斜杠時,它會向您顯示非原始文字的內容。

這三個是等價的:

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM