【发布时间】:2017-08-31 23:09:03
【问题描述】:
有没有办法完全在正则表达式中按出现顺序匹配唯一的字符组(以下情况下的单词)?如果是这样,该表达式在效率上与非正则表达式解决方案相比如何?我正在使用 Python 的风格,但我也对任何其他风格的解决方案感兴趣。
这是一个示例案例:
string = 'the floodwaters are rising along the coast'
unique = ['the', 'floadwaters', 'are', 'rising', 'along', 'coast']
在 Python-regex 混合解决方案中,我可以匹配我想要的组,并使用列表推导来删除重复项,同时保持顺序。
groups = re.findall('[a-zA-Z]+', string)
unique = [g for i, g in enumerate(groups) if g not in groups[:i]]
整个网站都有类似的问题,例如one that addresses matching unique words。然而,接受答案的表达式匹配给定组的最右边出现,而我想匹配 first 出现。这是那个表达式:
(\w+\b)(?!.*\1\b)
【问题讨论】:
-
正则表达式库不同。在 Python 中,您可以使用 PyPi
regex库,并使用\b(\w+)\b(?<!(?:.*\b\1\b){2})。在 .NET 中,您也可以使用它。 -
通常,例如 C++ 中的 unique,不保留顺序。那是因为必须先对列表进行排序。
-
而
(\w+\b)(?!.*\1\b)不会匹配第一次出现的单词。它将匹配最后的副本,而不是开始。您最好的选择是拆分以获取所有单词,然后从该集合中进行 unique 进行自己的保存。正则表达式会慢得令人难以置信www........ -
@WiktorStribiżew:确实可以与
regex库一起使用(感谢快速建议),但我正在寻找广泛(最好是本地)兼容的东西。除了你链接的那个之外,我似乎也无法让它与任何在线正则表达式测试器一起工作。 -
没有“本机兼容”正则表达式。正如我所说,所有正则表达式的风格都是不同的。在绝大多数情况下,您无法单独使用正则表达式完成您需要的工作。
标签: regex performance regex-group