2010-02-18 57 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