【问题标题】:How to solve this using regex?如何使用正则表达式解决这个问题?
【发布时间】:2010-02-18 17:49:21
【问题描述】:

鉴于该字符串:

\n \n 文本1\n \ttext2\n 消息:第一条消息\n 还有一些文字\n \n \n 消息:2dn 消息\n\n \t\t 消息: 第三条消息\n 文本3\n

我想从多行字符串中提取消息(标记为“消息:”)。我应该使用什么正则表达式来捕获这 3 个组:

  • 第 1 组:“第一条消息”
  • 第 2 组:“2dn 消息”
  • 第 3 组:“第三条消息”

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

我的程序是在 python 2.6 中,但我想我使用什么语言并没有太大区别......

【问题讨论】:

  • 您不关心下一行的some more texttext 部分吗?发布您的正则表达式
  • 正确;我只希望内容与“消息:”在同一行

标签: python regex


【解决方案1】:
>>> 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']

我很惊讶它不在您尝试过的众多事情的列表中:)

【讨论】:

  • 如果这就是他想要的,为什么不直接 re.findall('Message: (.+)', s)?
  • 我对正则表达式完全陌生,我走错了路。首先,我尝试使用match,而不是findall(我不确定每个人的作用,但我会继续阅读)。出于某种原因,我认为我必须在表达式的开头使用通配符。
  • @Sly: findall 类似于search 而不是match,除了它在找到匹配后不会停止而是继续并尝试匹配更多内容并累积列表中的所有内容. match 仅从字符串的开头开始搜索。不,您不必在字符串的开头使用通配符。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多