我試圖創建一個使用下面的規則創建一個動詞的第三人稱形式相匹配的正則表達式:如果動詞在電子商務不是我之前結束正則表達式一款第三人稱動詞
, o,s,x,z,ch,sh,add s。
所以我在尋找匹配由一些字母,然後不 I,O,S,X,Z,CH,SH,然後 「ES」 字正則表達式。我嘗試這樣做:
\b\w*[^iosxz(sh)(ch)]es\b
據regex101它「喜歡」相匹配,「討厭」等。但是,它不匹配「沐浴」,爲什麼不呢?
我試圖創建一個使用下面的規則創建一個動詞的第三人稱形式相匹配的正則表達式:如果動詞在電子商務不是我之前結束正則表達式一款第三人稱動詞
, o,s,x,z,ch,sh,add s。
所以我在尋找匹配由一些字母,然後不 I,O,S,X,Z,CH,SH,然後 「ES」 字正則表達式。我嘗試這樣做:
\b\w*[^iosxz(sh)(ch)]es\b
據regex101它「喜歡」相匹配,「討厭」等。但是,它不匹配「沐浴」,爲什麼不呢?
您可以使用
\b(?=\w*(?<![iosxz])(?<![cs]h)es\b)\w*
因爲Python re
不支持在回顧後可變長度的選擇,你需要的條件在這裏分成兩個lookbehinds。
圖案的詳細資料:
\b
- 領先的字邊界(?=\w*(?<![iosxz])(?<![cs]h)es\b)
- 一個正向前查找需要的序列:
\w*
- 0+字字符(?<![iosxz])
- 一定不能有i
,, s
,x
,z
字符當前位置的前面,並...(?<![cs]h)
- 沒有ch
或sh
當前位置前右...es
- 隨後與es
...\b
- 在年底單詞\w*
- 零個或多個(也許+
在這裏最好匹配1個或多個)字符。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))
如果要匹配以e
結束,沒有被i
開頭的字符串,o
,s
,x
,z
,ch
,sh
,你應該使用:
(?<!i|o|s|x|z|ch|sh)e
你的正則表達式[^iosxz(sh)(ch)]
由character group ,^
只是否定,其餘的將是正好匹配,所以它相當於:
[^io)sxz(c]
這實際上意味着:「匹配任何不是」io)sxz(c「)。
Python中的['(?<!| | o | s | x | z | ch | sh)e' regex不能編譯](http://ideone.com/tYGFb0)。 –
@WiktorStribiżew無論編程語言如何,我都編寫了一個純正則表達式。 – Maroun
沒有像「純粹」的正則表達式這樣的事情。你的'(?<!i | o | s | x | z | ch | sh)e'將在.NET,Java,PCRE中工作,但不能在Python're'中工作。 –
'[^ iosxz(SH)(CH)]'沒有做什麼,你認爲它。它相當於'[^ chiosxz()]'。 – Biffen
*如果名詞以前面沒有i,o,s,x,z,ch,sh *的e結尾 - 那麼'house','houses'怎麼樣? – RomanPerekhrest
@RomanPerekhrest - 我打算寫一個「第三人稱形式的動詞」。對困惑感到抱歉。而且,這個特定的規則只是爲了匹配所有動詞的一小部分(ish)子集。 – maestromusica