2015-05-04 58 views
-1

正常點匹配除換行符外的所有字符。如果我想匹配所有包含換行符的字符,我可以使用[\ s \ S](只是一個例子)來獲得正確的結果。如何在正則表達式中創建自定義點?

但是如何像「匹配所有的字符除外';' 「?

或「匹配除」A「和」b「以及」c「之外的所有字符?

我該如何定製一個點與*來匹配我想要的?

+0

正則表達式的味道相差很大。一些(.NET,Python的正則表達式)支持集。哪個正則表達式? Awk,老Python,sed,Javascript甚至沒有能夠做到這一點... – dawg

+0

@dawg:他標記了這個Python,所以他大概不關心POSIX正則表達式,JavaScript等等。另外,哪個老的Python didn不支持字符集作爲角色類?我很確定Python的正則表達式引擎從一開始就借用了Perl的語法。就像JavaScript一樣。更不用說,即使POSIX基本正則表達式也支持它。我想不出任何味道。 – abarnert

+0

@abarnert:我的意思是'/ [[a-z] - [aeiou]] /'的形式,作爲POSIX,sed,Python的一個例子,絕對不支持作爲所有非元音字母的簡寫。 – dawg

回答

1

要讓點匹配換行符,請使用re.DOTALL作爲選項。例如:

In [4]: print re.match("A.+B","A\n\nB") 
None 

In [5]: print re.match("A.+B","A\n\nB",re.DOTALL) 
<_sre.SRE_Match object at 0x10c5d17e8> 

這改變在表達式中的所有點,雖然。另外,您也可以使用(|),只在某些情況下匹配「\ n」:

In [6]: print re.match("A(?:\n|.)+B","A\n\nB") 
<_sre.SRE_Match object at 0x10ca5feb8> 

這裏我們使用:爲了從製作組保持?每個(?:\n|.)將匹配一個換行換行符。

對於其他事情,您通常使用「[]」或「[^]」僅匹配一組事物,或僅匹配一組事物。除了';'之外,對於除了A,b和c之外的所有字符,使用「[^ Abc]」,而對於只有匹配那三個,使用「[Abc] 」。還有各種簡寫的東西,例如\ s表示空格,\ S表示非空格。通過the re documentation看這裏真的很有幫助。

0

Python regex模塊和一些其他正則表達式風格支持設置字符類中的操作超出簡單的否定。

例如,在Python正則表達式(但不是在標準庫重):

>>> import regex 
>>> s='abcdefghijklmnopqrstuvwxyz' 
>>> regex.findall(r'(?V1)[[a-z]--[c-o]]', s) 
['a', 'b', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 

的字符類[a-z]通常會發現所有的ASCII小寫字母。在這種情況下,不包括[c-o]之間的任何因素,因爲它們被扣除。

的是,某種意義上可以否定,以及:

>>> regex.findall(r'(?V1)[^[a-z]--[c-o]]', s) 
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o'] 

或者沒有元音:

>>> regex.findall(r'(?V1)[[a-zA-Z]--[aAeEiIoOuU]]', s) 
['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'] 
+1

標準庫中的're'模塊_also_支持集合。它不支持像差異這樣的設置操作,但是他不需要爲他要求的任何示例執行這樣的操作。 – abarnert