我正在查询Python中的部分正则表达式匹配。
例如:
如果你有一个字符串:
string = 'foo bar cat dog elephant barn yarn p n a'
和一个正则表达式:
pattern = r'foo bar cat barn yard p n a f'
以下情况为真:
re.match(pattern, string)
将返回None
。re.search(pattern, string)
也将返回None
尽管我们都可以看到模式的第一部分与字符串的第一部分相匹配。
那么,除了在字符串中搜索整个模式之外,有没有一种方法可以查看字符串中与模式匹配的百分比?
3条答案
按热度按时间l7mqbcuq1#
是的,可以进行部分正则表达式匹配
我一直在尝试部分匹配的想法,并在搜索过程中发现了这个Q。我找到了一种方法来做我需要的,并认为我会在这里发布。
这不是速度恶魔。可能只有在速度不是问题的情况下才有用。
此函数查找正则表达式的最佳部分匹配并返回匹配文本。
测试它:
表现如预期。该算法不断尝试将尽可能多的表达式与目标字符串进行匹配。它将继续,直到整个表达式都与目标字符串匹配,并保留最佳部分匹配。
好吧。现在让我们看看它到底有多慢…
re.match()
直接运行它,它只需要进行常规匹配,并且大部分时间都失败了,这可能不是对函数性能的公平比较。一个更好的比较是针对一个支持模糊匹配的模块,我在下面做了。而且函数运行良好。*可以使用
re.sre_parse
和/或re.sre_compile
模块开发性能更高的解决方案。看起来所有的文档都在源代码和网络上的一些片段中,比如https://www.programcreek.com/python/example/1434/sre_parse。有了这些模块,我认为可能有一种方法可以通过标记或子表达式来递增地应用正则表达式,而不是像我所做的那样通过单个字符。
此外,正如有人评论的那样,正则表达式包具有模糊匹配功能(https://pypi.org/project/regex/)-但它的行为略有不同,可能允许部分匹配中出现意外字符。
性能比没有
regex.ENHANCEMATCH
标志的partial_match()
解决方案稍好。不过,有旗子的话速度会慢一些。带有
regex.BESTMATCH
标志的正则表达式在行为上可能与partial_match()
最相似,但它甚至更慢:regex
也有一个partial=True
标志,但这似乎并不像我们期望的那样工作。00jrzges2#
不使用正则表达式。
您甚至可以匹配单词而不是字符:
vtwuwzda3#
据我所知,任何正则表达式库都不可能做到这一点,但如果您可以访问状态机并一次遍历一个字符,就可以做到这一点。
将正则表达式编译成状态机有点棘手,但是运行状态机很简单,因此您可以执行任何类型的步进。例如,mine is here
这可以告诉你在多少个字符之后,它从“可能匹配取决于未来的输入”切换到“由于冲突而不匹配”,但不是直接的百分比(尽管我不认为这是你真正想要的)。