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

6
我正在尝试创建一个正则表达式,用于匹配使用以下规则创建的动词的第三人称形式:
如果动词以e结尾,而前面没有i,o,s,x,z,ch,sh,则添加s。
因此,我正在寻找匹配由一些字母组成的单词的正则表达式,然后不是i,o,s,x,z,ch,sh,然后是"es"。我尝试了这个:
\b\w*[^iosxz(sh)(ch)]es\b

根据regex101,它匹配"likes"、"hates"等内容。然而,它不匹配"bathes",为什么呢?

2
"[^iosxz(sh)(ch)]" 不是你想象中的那样。它等同于 "[^chiosxz()]"。 - Biffen
如果名词以e结尾,且前面没有i、o、s、x、z、ch、sh等字母,那么house怎么变成复数形式呢?是不是变成houses - RomanPerekhrest
@RomanPerekhrest - 我的意思是“第三人称形式的动词”。抱歉让你产生困惑。此外,这个特定规则只适用于所有动词的一个较小子集。 - maestromusica
1
使用否定类加回顾前缀怎么样:\b\w*[^iosxz](?<![sc]h)es\b(只要您要求至少有一个前导字符,就应该没问题)。 - bobble bubble
2个回答

2
你可以使用。
\b(?=\w*(?<![iosxz])(?<![cs]h)es\b)\w*

查看正则表达式演示 由于Python的re不支持在后顾中使用变长的选择项,因此您需要将条件拆分为两个后顾。 模式详细信息:
  • \b - 一个单词的开头边界
  • (?=\w*(?<![iosxz])(?<![cs]h)es\b) - 一个正向前瞻,需要以下顺序出现:
    • \w* - 0个或多个单词字符
    • (?<![iosxz]) - 当前位置右侧不能有i, o, s, x, z字符,且...
    • (?<![cs]h) - 当前位置右侧不能有chsh字符,且...
    • es - 后面跟着es...
    • \b - 单词结尾
  • \w* - 零个或多个(也许用+更好来匹配一个或多个)单词字符。

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

1
如果你想匹配以e结尾且不以iosxzchsh开头的字符串,你应该使用:
(?<!i|o|s|x|z|ch|sh)e

你的正则表达式[^iosxz(sh)(ch)]字符组组成,^仅仅是否定符号,其余部分将被精确匹配,因此它等效于:
[^io)sxz(c]

这实际上意味着:“匹配任何不是“io)sxz(c”之一的内容。”

1
你的Python代码中的[(?<!i|o|s|x|z|ch|sh)e]正则表达式无法编译。 - Wiktor Stribiżew
@WiktorStribiżew 我写了一个纯正则表达式,不考虑编程语言。 - Maroun
4
没有所谓的“纯粹”正则表达式。你的 (?<!i|o|s|x|z|ch|sh)e 在 .NET、Java、PCRE 中可用,但在 Python 的 re 中无法使用。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接