Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python regexp匹配完整或部分单词_Python_Regex_Substring_Character Class - Fatal编程技术网

Python 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来实现这一点会让人觉得好笑。不幸的是,我想到的

有没有办法让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']