匹配完整或部分单词的Python正则表达式



有没有办法让regexp尽可能多地匹配特定单词?例如,如果我正在寻找以下单词:昨天、今天、明天

我希望提取以下完整单词:

  • 是的
  • 昨天
  • tod
  • toda
  • 今天
  • 汤姆
  • tomor
  • 明天

    以下单词应该不匹配(基本上是拼写错误):

  • 昨天
  • 断层摄影
  • 明天
  • tody

    到目前为止,我能想到的最好的是:

    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?)?)?)?)?-yestyesteyesteryesterdyesterdayesterday
      • tod(?:ay?)?-todtodatoday
      • tom(?:o(?:r(?:r(?:o(?:w)?)?)?)?)?-tomtomotomortomorrtomorrotomorrow
    • 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/

    最新更新