正则表达式为第三人称动词

mae*_*ica 6 python regex

我正在尝试创建一个正则表达式,该正则表达式匹配使用以下规则创建的动词的第三人称形式:

如果动词以e结尾,而不是i,o,s,x,z,ch,sh,则添加s.

所以我正在寻找匹配由一些字母组​​成的单词的正则表达式,然后不是 i,o,s,x,z,ch,sh,然后是"es".我试过这个:

\b\w*[^iosxz(sh)(ch)]es\b
Run Code Online (Sandbox Code Playgroud)

根据regex101它匹配"喜欢","讨厌"等.然而,它不匹配"沐浴",为什么不呢?

Wik*_*żew 2

您可以使用

\b(?=\w*(?<![iosxz])(?<![cs]h)es\b)\w*
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

由于Pythonre不支持lookbehind中的可变长度替代方案,因此您需要在此处将条件拆分为两个lookbehind。

图案详情

  • \b- 前导词边界
  • (?=\w*(?<![iosxz])(?<![cs]h)es\b)- 积极的前瞻需要一系列:
    • \w* - 0+ 个单词字符
    • (?<![iosxz])- 当前位置之前不能有i, o , s, x,z字符并且...
    • (?<![cs]h)- 没有chsh就在当前位置之前...
    • es- 随后是es...
    • \b- 在单词的末尾
  • \w*- 零个或多个(也许+这里匹配 1 个或多个)单词字符更好。

请参阅Python 演示

import re
r = re.compile(r'\b(?=\w*(?<![iosxz])(?<![cs]h)es\b)\w*')
s = 'it matches "likes", "hates" etc. However, it does not match "bathes", why doesn\'t it?'
print(re.findall(r, s))
Run Code Online (Sandbox Code Playgroud)