Python中的正则表达式findall()

时间:2013-07-03 01:39:06

标签: python regex match findall

如果我有这个字符串:

s = "this, that; talk, love, hate; good, bad, all good."

我想要提取分隔的项目,;或。

所以我想要的结果是:

["this", "that", "talk", "love", "hate", "good", "bad", "all good"]

如果我使用这个Python正则表达式:

re.findall(r"([a-z]+[,;.])+", s)

我得到了结果:

['this,', 'that;', 'talk,', 'love,', 'hate;', 'good,', 'bad,', 'good.']

这是我想要的,除了最后一项。

奇怪的是,如果我在第一个方括号中包含一个空格,如:

re.findall(r"([a-z ]+[,;.])+", s)

然后我才得到这个结果:

[' all good.']

但是findall()应该找到所有结果,不是吗?有人可以解释这种奇怪的行为吗?

4 个答案:

答案 0 :(得分:3)

您的目标是通过分隔符将字符串拆分为令牌,因此与使用re.findall()相比,更好的方法是使用re.split()。在这种情况下,您可以使用

>>> re.split(r"[,;.]\s", s)
['this', 'that', 'talk', 'love', 'hate', 'good', 'bad', 'all good.']

不幸的是,如果您使用[,;.]\s作为正则表达式,此方法会将句点放在最后一项的末尾,如果您改为使用{{1,则在结果列表的末尾添加一个空字符串作为正则表达式。但是,我们可以通过删除最后一个字符串来解决这个问题:

[,;.]\s?

答案 1 :(得分:1)

您可以使用前瞻:

>>> list(re.findall(r"([a-z][a-z ]+(?=[,;.]))+", s))
['this', 'that', 'talk', 'love', 'hate', 'good', 'bad', 'all good']

但@ murgatroid99推荐的re.split()更好。

答案 2 :(得分:1)

您可以使用:

re.findall(r'[\w\s]+', s)

答案 3 :(得分:0)

+(在close-quote之前)在括号之外。把它放在里面,因此:

re.findall(r"\s*([a-z ]+)[ ,;.]+", s)