2016-11-13 74 views
6

我试图创建一个使用下面的规则创建一个动词的第三人称形式相匹配的正则表达式:如果动词在电子商务不是我之前结束正则表达式一款第三人称动词

, o,s,x,z,ch,sh,add s。

所以我在寻找匹配由一些字母,然后 I,O,S,X,Z,CH,SH,然后 “ES” 字正则表达式。我尝试这样做:

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

据regex101它“喜欢”相匹配,“讨厌”等。但是,它不匹配“沐浴”,为什么不呢?

+2

'[^ iosxz(SH)(CH)]'没有做什么,你认为它。它相当于'[^ chiosxz()]'。 – Biffen

+0

*如果名词以前面没有i,o,s,x,z,ch,sh *的e结尾 - 那么'house','houses'怎么样? – RomanPerekhrest

+0

@RomanPerekhrest - 我打算写一个“第三人称形式的动词”。对困惑感到抱歉。而且,这个特定的规则只是为了匹配所有动词的一小部分(ish)子集。 – maestromusica

回答

2

您可以使用

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

regex demo

因为Python re不支持在回顾后可变长度的选择,你需要的条件在这里分成两个lookbehinds。

图案的详细资料

  • \b - 领先的字边界
  • (?=\w*(?<![iosxz])(?<![cs]h)es\b) - 一个正向前查找需要的序列:
    • \w* - 0+字字符
    • (?<![iosxz]) - 一定不能有i,, s,xz字符当前位置的前面,并...
    • (?<![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

如果要匹配以e结束,没有被i开头的字符串,osxzchsh,你应该使用:

(?<!i|o|s|x|z|ch|sh)e 

你的正则表达式[^iosxz(sh)(ch)]character group^只是否定,其余的将是正好匹配,所以它相当于:

[^io)sxz(c] 

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

+1

Python中的['(?<!| | o | s | x | z | ch | sh)e' regex不能编译](http://ideone.com/tYGFb0)。 –

+0

@WiktorStribiżew无论编程语言如何,我都编写了一个纯正则表达式。 – Maroun

+4

没有像“纯粹”的正则表达式这样的事情。你的'(?<!i | o | s | x | z | ch | sh)e'将在.NET,Java,PCRE中工作,但不能在Python're'中工作。 –