【问题标题】:Looping over group in a Python regex在 Python 正则表达式中循环组
【发布时间】:2014-12-02 02:09:54
【问题描述】:

编辑:我已经搞定了——我忘记在多个边上放置一个空格作为分隔符。

我有这个 Python 正则表达式,它可以处理我必须解析的大部分字符串。

edge_value_pattern = re.compile(r'(?P<edge>e[0-9]+) +(?P<label1>[^ ]*)[^"]+"(?P<word>[^"]+)"[^:]+:: (?P<label2>[^\n]+)')

这是我的正则表达式要解析的示例字符串:

'e0 BIKE-EVENT 1 "biking" 2'

它正确地将e0 存储到edge 组中,将BIKE-EVENT 存储到label1 组中,并将"biking" 存储到word 组中。最后一组label2 用于字符串的稍微不同的变体,如下所示。请注意,label2 正则表达式组在给定如下字符串时会按预期运行。

'e29 e30 "of" :: of, OF'

然而,正则表达式模式用值e30. 填充label1 事实上,这个字符串没有任何label1 值——它应该是None 或至少是空字符串。一个特别的解决方案是使用正则表达式解析label1 以确定它是实际标签还是只是另一个边缘。我想知道是否有办法修改我的原始正则表达式,以便edge 组包含所有edges。例如,上述字符串的输出将是:

edge = "e29 e30"

label1 = None

word = of

label2 = of, OF

我在下面尝试了这个解决方案,我认为这将转化为简单地循环第一组edge(如果我有一个实际的 FSA,这将是微不足道的),但它不会改变正则表达式的行为。

edge_value_pattern = re.compile(r'(?P<edge>(e[0-9]+)+) +(?P<label1>[^ ]*)[^"]+"(?P<word>[^"]+)"[^:]+:: (?P<label2>[^\n]+)')

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    如果你想让edge 匹配"e29 e30",你必须把重复放在组内,而不是放在组外。

    您通过在 edge 组中插入一个新组和 + 重复来做到这一点 - 这很好,尽管您可能希望在那里有一个非捕获组 - 但您忘记在重复组内包含空格.

    (您还离开了外部重复,并使用了一个捕获组,您可能想要一个非捕获,但这些不太严重。)

    只看那个片段:

    (?P<edge>(e[0-9]+)+)
    

    Debuggex Demo

    在这里,表达式将e29 作为一个匹配项,然后将e30 作为一个后续匹配项。因此,如果您在表达式中添加任何其他内容,它要么会错过e29,要么会失败。但是添加空格:

    (?P<edge>(e[0-9]+ )+)
    

    Debuggex Demo

    现在它匹配 e29 e30 加上尾随空格作为一个匹配项,这意味着您可以添加任何其他内容并且它会起作用(只要您正确获取了其他内容 - 您仍然需要删除额外的内容+,我认为您可能需要进行其他几次非贪婪的重复......)。

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多