Python中的正则表达式 - 在多行上匹配

时间:2014-03-19 13:40:51

标签: python regex expression newline lines

我需要一些帮助,我在一些Python代码中使用的正则表达式,我几乎创建了我需要的表达式,我非常接近。以下是我使用的Python代码:

import re

def main():

    f = open('/tmp/file', 'r')
    rexp = re.compile('(?m)^   [*] ''([^ ]+).*\(([^ \)]+)')
    upgrades = rexp.findall(f.read())

    print upgrades

    f.close()

main()

这是/ tmp / file的内容:

Software Update Tool
Copyright 2002-2010 Apple

2014-03-18 14:31:28.958 softwareupdate[5505:3603] No alternate URLs found for packageId     MobileDevice
Software Update found the following new or updated software:
   * SecUpd2014-001-1.0
        Security Update 2014-001 (1.0), 112751K [recommended] [restart]
   * Safari6.1.2MountainLion-6.1.2
        Safari (6.1.2), 51679K [recommended]
   * iTunesXPatch-11.1.5
        iTunes (11.1.5), 79522K [recommended]

使用上面的表达式,我得到以下输出:

[('SecUpd2014-001-1.0\n', '1.0'), ('Safari6.1.2MountainLion-6.1.2\n', '6.1.2'), ('iTunesXPatch-11.1.5\n', '11.1.5')]

对于我的问题,如何更改表达式以使输出变为这样?

[('SecUpd2014-001-1.0', '1.0'), ('Safari6.1.2MountainLion-6.1.2', '6.1.2'), ('iTunesXPatch-11.1.5', '11.1.5')]

我一直在寻找类似的场景,但正则表达式往往非常具体,所以我找不到任何有用的东西。如果您需要更多信息,我会感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:3)

在正则表达式中使用[\n\r]将其置于捕获之外将为您提供帮助。

rexp = re.compile('(?m)^   [*] ''([^ ]+)[\n\r].*\(([^ \)]+)')
                                        ^^^^^^