2011-11-09 83 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 + | $)':一个或多个空白字符**或**字符串的结尾。但是最初的正则表达式在问题中给出的例子中工作。 –

相关问题