2010-02-18 44 views
2

鑑於字符串:如何使用正則表達式解決此問題?

 
\n 
\n 
text1\n 
\ttext2\n 
    Message: 1st message\n 
some more text\n 
\n 
\n 
    Message: 2dn message\n\n 
\t\t 
Message: 3rd message\n 
text3\n 

我想提取從多行字符串的消息(令牌「消息:」)。應使用哪種正則表達式表達捕捉那些3組:

  • 組1: '第一消息'
  • 組2: '2DN消息'
  • 組3: '第三消息'

我嘗試了很多東西,但我可以讓表達式工作,因爲字符串是一個多行字符串。

我的計劃是在Python 2.6,但我想這不會有很大的區別是什麼語言我用...

+0

你不關心'一些text'和'是放在後面的行text'部分?正確發佈您的正則表達式 – SilentGhost 2010-02-18 17:52:13

+0

;我只是想把內容放在'留言:' – Sylvain 2010-02-18 17:53:52

回答

9
>>> re.findall('Message: (.+?)$', s, re.M) 
['1st message', '2dn message', '3rd message'] 

re.M flag gives special meaning to ^ and $

指定,圖案人物'^'匹配字符串的開頭和每行的開頭(緊接着每個換行符);並且模式字符'$'匹配字符串的末尾和每行末尾(緊接在每個換行符之前)。缺省情況下,'^'僅在字符串的開始處匹配,而'$'僅在字符串的末尾匹配,緊接在字符串末尾的換行符(如果有)之前。

(.+?)$匹配至少一個字符,直到字符串最接近的一個字符。

編輯:確實是簡單的版本也可以工作:

>>> re.findall('Message: (.+)', s) 
['1st message', '2dn message', '3rd message'] 

我很驚訝這是不是你嘗試過:)

+0

太棒了!你能解釋它是如何工作的嗎? – Sylvain 2010-02-18 17:59:19

+2

如果這就是他想要的,爲什麼不只是re.findall('Message:(。+)',s)? – 2010-02-18 18:01:48

+0

我對於正則表達式是全新的,而我卻走錯了路。首先,我試圖使用'match',而不是'findall'(我不確定每個人都做了什麼,但我會閱讀它)。出於某種原因,我認爲我必須在表達式的開頭使用通配符。 – Sylvain 2010-02-18 18:21:01

0

@ OP的那些無數事情的清單,你不需要正則表達式。假設你不關心"Message:"後線,

for line in mystring.split("\n") 
    if "Message:" in line: 
     print "found: ",line