2016-03-07 20 views

回答

2

如果你沒有想的Unicode的,你可以使用

[ \t\r\f\v] 

或者,由於\v匹配的VT(中古立式符號,\x0b),\r也被認爲是一個換行符,並\f也一種垂直空白(而過時,現在雖然 - (進紙,\x0c):

[ \t] 

docs

\s
當未指定UNICODE標誌時,它的任何空白字符相匹配,這等同於集合[ \t\n\r\f\v]LOCALE標誌對空間的匹配沒有額外的影響。如果設置了UNICODE,則它將與字符[ \t\n\r\f\v]加上匹配,無論在Unicode字符屬性數據庫中哪些屬於空間。

如果你需要支持所有Unicode空間,使用

\s(?<!\n) 

這個表達式將匹配任何空白,是不是換行。

參見regex demo

的如何將限制添加到一個速記字符類的另一個示例中,使用它的一個否定的字符類的內部相對。 \S\s相反的速記字符類,所以,我們應該把它變成[^...]和*從\s添加字符,我們需要排除:

[^\S\n] 

添加\r\v等,如果你需要排除所有換行符。 [^\S\n]匹配除非空白(=匹配任何空格)和換行符以外的任何字符。

+0

「或者,因爲'\ v'也可能與換行符匹配...」:不在Python中不能, –

+0

@AlanMoore:'\ v'出現在空白列表中,它表​​示一個垂直空間,因此,如果要排除所有可能的換行符號,我建議刪除它'print(hex (ord(「\ v」)))[[prints](https://ideone.com/a7Ss9Y)'0xb'('= vertical tabulation(VT)') –

+0

我同意OP應該排除所有垂直空格其中包括'\ f',BTW),但你說'\ v'匹配一個換行符,事實並非如此,'\ v'匹配一個垂直製表符,'\ n'匹配一個換行符。 –

0

\s匹配[\r\n\t\f ],如果你只想要空格,你可以使用以下命令:

>>> re.sub(' ', '', 'test string\nwith new line') 

由於' '空間(直譯),這將刪除所有的空格,但將保持\n字符匹配。

0

有沒有什麼方法可以跳過\n\s在正則表達式中?

您可能會使用負向預測。

re.sub(r'(?!\n)\s', '', s) 

如果您還想跳過回車,請在負面預覽內添加\r

re.sub(r'(?!\n|\r)\s', '', s) 

這就像一種減法。即上面的正則表達式會減去\n\r from \s

+0

嘿感謝阿維納什。在一些地方它不工作。 – user2550098

+0

例如: - mystrng =「」\ na dsf cd \ nb \ nc hdfbs \ n dffs \ t fdvfv \ tdfd dsf \ n「:對於這個字符串,它將刪除hdfbs和dffs之間的」\ n「。 – user2550098

+0

@ user2550098 [這是不可能的](https://regex101.com/r/cE0rI7/1) –

1

您可以使用否定的字符類[^\S\n]其中\S是所有這不是一個空白:

re.sub(r'[^\S\n]', '', s) 
+0

我已經回來添加到我的答案,並看到這一點。我仍然會添加它。 –