2016-11-13 24 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'中工作。 –