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

时间:2016-11-13 09:50:19

标签: python regex

我试图创建一个与使用以下规则创建的动词的第三人称形式相匹配的正则表达式:

  

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

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

\b\w*[^iosxz(sh)(ch)]es\b

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

2 个答案:

答案 0 :(得分:2)

您可以使用

\b(?=\w*(?<![iosxz])(?<![cs]h)es\b)\w*

请参阅regex demo

由于Python re不支持lookbehind中的可变长度替代,因此您需要在这里将条件分成两个lookbehinds。

模式详情

  • \b - 领先的单词边界
  • (?=\w*(?<![iosxz])(?<![cs]h)es\b) - 一个积极的前瞻,需要一系列:
    • \w* - 0+ word chars
    • (?<![iosxz]) - 在当前位置之前不得有i, sxz个字符,并且......
    • (?<![cs]h) - 在当前位置之前没有chsh ...
    • es - 后跟es ...
    • \b - 在
    • 一词的末尾
  • \w* - 零或更多(可能+更适合匹配1个或多个)字词。

请参阅Python demo

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))

答案 1 :(得分:1)

如果您希望匹配以Protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); } 结尾且前面没有eios,{{1}的字符串},xz,你应该使用:

ch

你的正则表达式shcharacter group组成,(?<!i|o|s|x|z|ch|sh)e 只是否定,其余的完全匹配,所以它相当于:

[^iosxz(sh)(ch)]

实际上意味着:“匹配任何不是”io“sxz(c”。