我试图创建一个与使用以下规则创建的动词的第三人称形式相匹配的正则表达式:
如果动词以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,它匹配"喜欢","讨厌"然而,它不符合"沐浴",为什么不呢?
答案 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
,, s
,x
,z
个字符,并且...... (?<![cs]h)
- 在当前位置之前没有ch
或sh
... 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);
}
结尾且前面没有e
,i
,o
,s
,{{1}的字符串},x
,z
,你应该使用:
ch
你的正则表达式sh
由character group组成,(?<!i|o|s|x|z|ch|sh)e
只是否定,其余的完全匹配,所以它相当于:
[^iosxz(sh)(ch)]
实际上意味着:“匹配任何不是”io“sxz(c”。