Python regexp匹配完整或部分单词

时间:2015-12-31 04:55:01

标签: python regex substring character-class

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

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

  • yest
  • 昨日
  • TOD
  • 户田
  • 今天
  • 汤姆
  • 托莫尔
  • 明天

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

  • yesteray
  • tomorow
  • 明天
  • tody

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

    \b((tod(a(y)?)?)|(tom(o(r(r(o(w)?)?)?)?)?)|(yest(e(r(d(a(y)?)?)?)?)?))\b (Example)

    注意:我可以使用有限状态机来实现它,但是认为让regexp执行此操作会很傻笑。不幸的是,我提出的任何事情都是非常复杂的,我希望我能错过一些东西。

  • 2 个答案:

    答案 0 :(得分:1)

    您正在寻找的正则表达式应该包含可选的替换组

    \b(yest(?:e(?:r(?:d(?:ay?)?)?)?)?|tod(?:ay?)?|tom(?:o(?:r(?:r(?:ow?)?)?)?)?)\b
    

    请参阅demo

    注意 \b字词边界非常重要,因为您只想匹配整个单词。

    正则表达式解释

    • \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 - 尾随字边界

    See Python demo

    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']
    

    答案 1 :(得分:0)

    管道分隔所有有效的单词或单词子串,如下所示。这只会匹配所需的有效拼写

    ^(?|yest|yesterday|tod|today)\b
    

    已经在https://regex101.com/

    进行了测试