Python regexp匹配完整或部分单词
有没有办法让regexp尽可能多地匹配特定单词?例如,如果我在寻找以下单词:昨天,今天,明天 我希望提取以下完整单词:Python regexp匹配完整或部分单词,python,regex,substring,character-class,Python,Regex,Substring,Character Class,有没有办法让regexp尽可能多地匹配特定单词?例如,如果我在寻找以下单词:昨天,今天,明天 我希望提取以下完整单词: 是的 昨天 托德 托达 今天 汤姆 托莫 明天 以下单词应不匹配(基本上是拼写错误): 昨天 明罗 明天 今天 到目前为止,我能想到的最好办法是: \b((tod(a(y)?))(tom(o(r(r(o(w)?))?)))(是的(e(r(d(a(y)?)))))))\b 注意:我可以使用有限状态机来实现这一点,但我认为让regexp来实现这一点会让人觉得好笑。不幸的是,我想到的
\b((tod(a(y)?))(tom(o(r(r(o(w)?))?)))(是的(e(r(d(a(y)?)))))))\b
注意:我可以使用有限状态机来实现这一点,但我认为让regexp来实现这一点会让人觉得好笑。不幸的是,我想到的任何东西都非常复杂,我希望我错过了一些东西。管道将所有有效单词或单词子字符串分开,如下所示。这将只匹配所需的有效拼写
^(?|yest|yesterday|tod|today)\b
已经在上测试过这一点,您正在寻找的正则表达式应该包括带有可选项的可选组
\b(yest(?:e(?:r(?:d(?:ay?)?)?)?)?|tod(?:ay?)?|tom(?:o(?:r(?:r(?:ow?)?)?)?)?)\b
看
请注意,\b
单词边界非常重要,因为您只想匹配整个单词
正则表达式解释:
-前导词边界\b
-捕获群匹配(yest(?:e(?:r(?:d(?:ay?)?)| tod(?:ay?)| tom(?:o(?:r(?:r(?:o(?:w?)?)?)
yest(?:e(?:r(?:d(?:ay?)
-tod(?:ay?)
或tod
或toda
今天
-tom(?:o(?:r(?:r(?:o(?:w)?)?)?
,tom
,tomo
,tomor
,tomorr
或tomorro
明天
-尾随词边界\b
向我们展示您尝试过的内容,以便我们可以建议您错过的用例。为什么不包括
y
,ye
,yes
for@dkf:请检查我的解决方案。这是一个PCRE正则表达式。这个问题与Python有关。我明白了。这里有一个关于python上PCRE正则表达式支持的不错的输入。这不是PCRE,PyPi正则表达式模块更酷:)它实际上是PCRE和.NET正则表达式风格的所有最佳功能的组合。我喜欢您今天的解决方案,非常干净。yest(erday)和tom(orrow)的解决方案不完整。如果你看看我提出的一个,它涵盖了yest*和tom*的每一个排列(除去不区分大小写);这就是我要找的。对不起,我想我已经说清楚了。嗯。。。但是,看看你的语法,我喜欢单词排列使用非捕获组,这就是我的语法产生丑陋结果的地方。你可以扩展到\b(例如tom(?:o(?:r(?:r(?:o(?:w)?)?)?)?)\b
。。。这是个丑陋的房间,但比我的干净。
import re
p = re.compile(ur'\b(yest(?:e(?:r(?:d(?:ay?)?)?)?)?|tod(?:ay?)?|tom(?:o(?:r(?:r(?:ow?)?)?)?)?)\b', re.IGNORECASE)
test_str = u"yest\nyeste\nyester\nyesterd\nyesterda\nyesterday\ntod\ntoda\ntoday\ntom\ntomo\ntomor\ntomorr\ntomorro\ntomorrow\n\nyesteray\ntomorow\ntommorrow\ntody\nyesteday"
print(p.findall(test_str))
# => [u'yest', u'yeste', u'yester', u'yesterd', u'yesterda', u'yesterday', u'tod', u'toda', u'today', u'tom', u'tomo', u'tomor', u'tomorr', u'tomorro', u'tomorrow']