有没有办法让regexp尽可能多地匹配特定单词?例如,如果我正在寻找以下单词:昨天、今天、明天
我希望提取以下完整单词:
以下单词应该不匹配(基本上是拼写错误):
到目前为止,我能想到的最好的是:
b((tod(a(y)?)?)|(tom(o(r(r(o(w)?)?)?)?)?)|(yest(e(r(d(a(y)?)?)?)?)?))b
(示例)
注意:我可以使用有限状态机来实现这一点,但我认为用regexp来实现这会很有趣。不幸的是,我想出的任何东西都非常复杂,我希望我只是错过了一些东西。
您要查找的正则表达式应该包括可选组和可选组。
b(yest(?:e(?:r(?:d(?:ay?)?)?)?)?|tod(?:ay?)?|tom(?:o(?:r(?:r(?:ow?)?)?)?)?)b
参见演示
注意b
单词边界非常重要,因为您只想匹配整个单词。
Regex解释:
b
-前导字边界(yest(?:e(?:r(?:d(?:ay?)?)?)?)?|tod(?:ay?)?|tom(?:o(?:r(?:r(?:o(?:w)?)?)?)?)?)
-一个捕获组匹配yest(?:e(?:r(?:d(?:ay?)?)?)?)?
-yest
、yeste
、yester
、yesterd
、yesterda
或yesterday
tod(?:ay?)?
-tod
或toda
或today
tom(?:o(?:r(?:r(?:o(?:w)?)?)?)?)?
-tom
、tomo
、tomor
、tomorr
、tomorro
或tomorrow
b
-尾随字边界
参见Python演示:
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"yestnyestenyesternyesterdnyesterdanyesterdayntodntodantodayntomntomontomorntomorrntomorrontomorrownnyesterayntomorowntommorrowntodynyesteday"
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']
管道分隔所有有效单词或单词子字符串,如下所示。这将只匹配所需的有效拼写
^(?|yest|yesterday|tod|today)b
已在测试https://regex101.com/