2016-09-17 72 views
0

我是一名Java開發人員,也是Python的新手。我想定義一個正則表達式接受所有的字母字符,除了其中的一些。我想排除元音和字符'y',無論是大寫還是小寫。Python版本的Java正則表達式?

Java中的正則表達式這將是如下:

"[a-zA-Z&&[^aeiouyAEIOUY]]" 

如何我(重新)將其定義爲在Python?上述對Python顯然不起作用。而且我也像下面的方式進行提示:

"[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]" 
+0

您是否嘗試從您的Java代碼中刪除'&&'? –

回答

2

我不認爲目前的蟒蛇正則表達式模塊有你在尋找什麼。最終的替代regex確實有你所需要的,你可以根據自己的意願安裝它。

除此之外,否定可能是一條路。基本上,定義你不想要的所有字符,然後反轉。聽起來很傷感,但「非字」速記(\W)可以幫助我們。 \w表示a-zA-Z0-9_(用於ASCII匹配),而\W表示相反(​​)。因此,[aeiouyAEIOUY\W\d_]意味着你不想找的每個角色,所以[^aeiouyAEIOUY\W\d_]意味着你正在尋找的每個角色。例如。

>>> import re 
>>> s = "xyz_ d10 word" 
>>> pattern = "[^aeiouyAEIOUY\W\d_]+" 
>>> re.findall(pattern, s) 
['x', 'z', 'd', 'w', 'rd'] 

如果您嚴格按照ASCII字符,那麼您可以使用ASCII標誌。例如。

>>> s = "Español" 
>>> re.findall(pattern, s) 
['sp', 'ñ', 'l'] 
>>> re.findall(pattern, s, re.ASCII) 
['sp', 'l'] 
0

(?i)[b-df-hj-np-tv-xz](?i)\w(?<![_aeiouy\d])。測試here

0

(?= ...)積極的前瞻斷言。如果包含的 正則表達式(此處用...表示)成功匹配當前位置的 ,則會成功,否則將失敗。但是,一旦試用了包含的 表達式,匹配引擎根本沒有進展; 模式的其餘部分在斷言開始的地方被嘗試。

(?!...)否定性超前斷言。這與 積極主張相反;如果包含的表達式不是 匹配字符串中的當前位置,它會成功。

r"(?![aeiouyAEIOUY])[a-zA-Z])" 
+0

我發現這種方法在嘗試匹配多個字符時遇到了問題。試試:'re.findall(r「((?![aeiouyAEIOUY])[a-zA-Z])+」,「string」)'。我期望'['str','ng']',但它會產生'['r','g']'。 – Dunes

+0

@Dunes使用非捕獲的'(?:..)'而不是'(...)'。整行:'re.findall(r「(?:(?![aeiouyAEIOUY])[a-zA-Z])+」,「string」)'。試試簡單的'[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]',你會得到相同的結果。 '['r','g']'結果是正確的,但這個評論可能太短而無法解釋。仔細閱讀文檔。這是兩個匹配的組。基本上第一場比賽是's'然後't'然後'r',第二場比賽是'n'然後'g'。新的比賽覆蓋舊的比賽。 – VPfB