2011-11-09 115 views
1

我有一個文本:正則表達式匹配單詞和結尾的空白對

" Alice, Bob Charlie " 

,我想它後獲得的詞對(如果有的話)和空白。那就是:

[("", " "), ("Alice,", " "), ("Bob", " "), ("Charlie", " ")]` 

在Python,我想:

re.findall(r"(\S*)(\s*)", " Alice, Bob Charlie ") 

幾乎工程 - 它只是增加了一對空("", "")末。如何擺脫它?除了.pop()?另外,我真的不明白爲什麼它在那裏 - 在匹配查理的空白之後,它應該完成,不是嗎?

編輯:澄清 - 我想第一對,即沒有一些空白的單詞。最後一個 - 沒有詞,沒有空白 - 是我想擺脫的那個。如果沒有.pop(),可能...

+0

'*'表示匹配_zero或more_,所以一個空字符串相匹配。僅僅因爲你有兩次並不意味着它們不會匹配空字符串。 – agf

回答

2

我認爲這將做到這一點

re.findall('(\S+|^)(\s*)', s) 
2
re.findall(r"(\S+)(\s*)", " Alice, Bob Charlie ") 

\S返回後一個+標誌你可能想:

[('Alice,', ' '), ('Bob', ' '), ('Charlie', ' ')] 

否則\S*\s*可能匹配在結尾空字符串:零或者更多,零或更多也可以等於零長度。

另一種可能性(除了.pop())將是:

[a for a in re.findall(r"(\S*)(\s*)", " Alice, Bob Charlie ") if a != ('','')] 

或:

re.findall(r"(\S*)(\s*)", " Alice, Bob Charlie ")[:-1] 

兩者返回正是你需要的(包括開頭的空格):

[('', ' '), ('Alice,', ' '), ('Bob', ' '), ('Charlie', ' ')] 
+1

不,它沒有。他也希望空白的空白。 – agf

2

嘗試將\s*更改爲\s+需要空白的至少1個字符:

>>> re.findall(r"(\S*)(\s+)", " Alice, Bob Charlie ") 
[('', ' '), ('Alice,', ' '), ('Bob', ' '), ('Charlie', ' ')] 
+0

如果他想匹配沒有尾隨空格的名字會怎麼樣? – agf

+0

如果文本是「愛麗絲,鮑勃查理」 - 查理不匹配。 –

+0

然後將第二個組更改爲'(\ s + | $)':一個或多個空白字符**或**字符串的結尾。但是最初的正則表達式在問題中給出的例子中工作。 –

相關問題