如何使用正则表达式来解决这个问题?

时间:2010-02-18 17:49:21

标签: python regex

鉴于字符串:

\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组:'第1条消息'
  • 第2组:'2dn message'
  • 第3组:'第3条消息'

我尝试了很多东西,但我可以让表达式工作,因为字符串是一个多行字符串。

我的程序是在python 2.6中,但我认为它对我使用的语言没有太大影响......

2 个答案:

答案 0 :(得分: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']

我很惊讶它不在你尝试过的众多事情的清单中。)

答案 1 :(得分:0)

@ OP,你不需要正则表达式。假设您不关心"Message:"之后的行,

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