编辑:我已经开始工作了–我忘记了放置一个空间作为多个边缘的分隔符。
我有这个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
当给定如下所示的字符串时,regex组的行为符合预期。
'e29 e30 "of" :: of, OF'
但是,正则表达式模式label1
使用值填充e30.
。事实是,此字符串没有任何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]+)')
如果要edge
匹配"e29 e30"
,则必须将重复放在组内,而不是在组外。
您可以通过在重复edge
组中插入一个新组来做到+
这一点-很好,尽管您可能希望在其中不使用捕获组-但您忘记在重复组中包含空格。
(您还留下了外部重复,并使用了一个捕获组,您可能想要不捕获,但是不太严重。)
看一下那个片段:
(?P<edge>(e[0-9]+)+)
在这里,表达式捕获e29
为一个匹配项,然后e30
为后续匹配项。因此,如果将其他任何内容添加到表达式中,它要么会丢失e29
,要么就会失败。但是添加空间:
(?P<edge>(e[0-9]+ )+)
现在,它是匹配项,e29 e30
加上尾随空格作为单个匹配项,这意味着您可以附加任何其他内容,并且可以正常工作(只要您正确地获得了这些额外的内容-您仍然需要删除这些额外的内容+
,我想您可能需要使其他两个重复变得非贪婪...)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句