【问题标题】:How to repeat a pattern in python regular expression?如何在python正则表达式中重复一个模式?
【发布时间】:2014-03-20 20:54:06
【问题描述】:

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

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

我想知道我可以从第一个开始重复该模式,原因是我不想为每种情况分组许多“曲线”或“单元”。

我的测试数据如下:

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

我们的想法是将 MD 和 RHO 也放在“曲线”组中。

【问题讨论】:

  • 请提供您用于进行实际模式匹配的代码
  • 另外,你可能想用 VERBOSE 标志来打破你的正则表达式

标签: python regex syntax


【解决方案1】:

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

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

用详细模式写成这样可能更好:

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

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

【讨论】:

  • 可选组,这正是我所需要的。谢谢。
【解决方案2】:

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

如果你想找到一个模式的每一个匹配,你可以使用re.findall(pattern, string)

它返回匹配的list..

re module docs

【讨论】:

    【解决方案3】:

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

    例子:

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

    通过这种方式,您选择了所有匹配项,并且它们的named groups 保持不变!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      相关资源
      最近更新 更多