我試圖從用#字符分隔的字符串中提取一個簡單的句子。如果包含換行符,正則表達式會失敗
str = "#text text text \n text#"
這種模式
pattern = '#(.+)#'
現在,有趣的是,當字符串包含換行符
out = re.findall(pattern, str) # out contains empty []
正則表達式是不匹配的,但如果我的\ n刪除字符串它工作正常。任何想法如何解決這個問題?
我試圖從用#字符分隔的字符串中提取一個簡單的句子。如果包含換行符,正則表達式會失敗
str = "#text text text \n text#"
這種模式
pattern = '#(.+)#'
現在,有趣的是,當字符串包含換行符
out = re.findall(pattern, str) # out contains empty []
正則表達式是不匹配的,但如果我的\ n刪除字符串它工作正常。任何想法如何解決這個問題?
將DOTALL
標誌添加到您的編譯或匹配中。
使用re.DOTALL
如果你希望你的.
匹配newline
也: -
>>> out = re.findall('#(.+)#', my_str, re.DOTALL)
>>> out
['text text text \n text']
而且,它不是用一個好主意,內置的名稱作爲您的變量名。使用my_str
而不是str
。
小心:正則表達式是貪婪的。像'「#text text \ n text ##」'這樣的字符串將與第二個包含的「#」匹配。使用Dima的解決方案來避免這種情況,或者使用非貪婪的變體:''(#+。)#''和're.DOTALL'。 – Evert
@Evert http://stackoverflow.com/questions/13842633/python-regular-expression-fails-if-newline-included#comment19053779_13842679;) – phant0m
@ phant0m我不明白你的觀點。這個答案仍然有貪婪的警告。 – Evert