2014-12-02 94 views
1

编辑:我已经得到它的工作 - 我忘记把它放在一个空间作为多边的分隔符。在Python正则表达式中循环遍历组

我有这个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'

它正确地存储e0edge组,BIKE-EVENTlabel1组,"biking"进入word组。最后一组label2用于字符串的稍微不同的变化,如下所示。请注意0​​正则表达式组的行为与预期的字符串类似,如下所示。

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

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

edge = "e29 e30"

label1 = None

word = of

label2 = of, OF

我试过低于这个解决方案,我认为会转化为简单的遍历第一组,edge(如果我有一个实际的FSA,这将是微不足道的),但它不会改变re的行为GEX。

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

回答

0

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

你这样做,通过粘贴新组edge组内有+重复,这是很好的,虽然你可能想要一个非捕获组存在,但你忘了,包括重复组内的空间。 (你也离开了外部重复,并使用了一个你可能想要不捕捉的捕捉组,但是那些并不那么严重。)

看只是片段:

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

Regular expression visualization

Debuggex Demo

这里,表述捕获e29作为一个匹配,则e30作为随后的匹配。所以,如果你给表达式增加了其他的东西,它可能会错过e29,或者只是失败。但增加的空间:

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

Regular expression visualization

Debuggex Demo

,现在它的匹配e29 e30加上尾随空间作为一个单一的比赛,这意味着你可以钉在任何额外的东西,它会工作(只要你获得了额外的东西 - 你仍然需要删除额外的+,我认为你可能需要做一些其他的重复非贪心...)。