如何在python正则表达式中重复模式?

时间:2014-03-20 20:54:06

标签: python regex syntax

我正在做一个python正则表达式并且有一个工作表达式:

\n(?P<curve>\w+)(?:.+)(?P<unit>\.\S*)(?:\s+.\s+)(?P<desc>:.+)|\n(?P<curve2>\w+)(?:.+)(?P<unit2>\.\S*)|\n(?P<curve3>\w+)

我想知道我可以从第一个开始重复这个模式,原因是我不希望在很多情况下进行分组&#34;曲线&#34;或&#34;单位&#34;对于每个案例。

我的测试数据如下:

#-------------
MD              
BMK_STA            .Mpsi                                   : Modulus
FANG        .                                   : Friction Angle
PR             .unitless                               :  
RHO           .g/cm3                                  

我们的想法是让MD和RHO也在&#34;曲线&#34;基。

3 个答案:

答案 0 :(得分:0)

我不完全确定你的意思,但以下内容可能有所帮助:

如果您想查找某个模式的每个匹配项,可以使用re.findall(pattern, string)

它会返回list个匹配项。

re module docs

答案 1 :(得分:0)

没有特殊的语法可以避免在正则表达式中出现这种重复,因此在一般情况下,您无法避免一定程度的重复。但是,在您的特定情况下,您应该能够使用可选组来解决您的问题:

\n(?P<curve>\w+)((?:.+)(?P<unit>\.\S*)((?:\s+.\s+)(?P<desc>:.+))?)?

最好以详细模式编写:

\n(?P<curve>\w+)
(
    .+
    (?P<unit>\.\S*)
    (
        \s+.\s+
        (?P<desc>:.+)
    )?
)?

使组嵌套更容易阅读。我也删除了?:组,因为在这种情况下它们是没用的。

答案 2 :(得分:0)

假设你的正则表达式是正确的。为此,请使用finditer()方法迭代所有匹配项。

示例:

for m in re.finditer(r'REGEX_GOES_HERE', text):
    print m.group('curve')
    print m.group("unit")

通过这种方式,您可以选择所有匹配项,并且named groups完整无缺!