2012-12-12 18 views
0

我試圖從用#字符分隔的字符串中提取一個簡單的句子。如果包含換行符,正則表達式會失敗

str = "#text text text \n text#" 

這種模式

pattern = '#(.+)#' 

現在,有趣的是,當字符串包含換行符

out = re.findall(pattern, str) # out contains empty [] 

正則表達式是不匹配的,但如果我的\ n刪除字符串它工作正常。任何想法如何解決這個問題?

+1

小心:正則表達式是貪婪的。像'「#text text \ n text ##」'這樣的字符串將與第二個包含的「#」匹配。使用Dima的解決方案來避免這種情況,或者使用非貪婪的變體:''(#+。)#''和're.DOTALL'。 – Evert

+0

@Evert http://stackoverflow.com/questions/13842633/python-regular-expression-fails-if-newline-included#comment19053779_13842679;) – phant0m

+0

@ phant0m我不明白你的觀點。這個答案仍然有貪婪的警告。 – Evert

回答

2

同樣通過re.DOTALL標誌,這使得.真正匹配所有的東西。

使'。'特殊字符完全匹配任何字符,包括換行符;沒有這個標誌,'。'將匹配除換行符之外的任何內容。

+0

是的,就是這樣,謝謝。 – Zed

0

DOTALL標誌添加到您的編譯或匹配中。

3

使用re.DOTALL如果你希望你的.匹配newline也: -

>>> out = re.findall('#(.+)#', my_str, re.DOTALL) 
>>> out 
['text text text \n text'] 

而且,它不是用一個好主意,內置的名稱作爲您的變量名。使用my_str而不是str

2

試試這個正則表達式"#([^#]+)#"

它將匹配分隔符之間的一切。

+0

這不具有相同的語義。這會停止第一個'#'的匹配,而不是最後一個'#',這可能是OP的意圖。所以+1。 – phant0m

相關問題