2

如果我有这个字符串:

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

4 回答 4

3

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

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

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

>>> re.split(r"[,;.]\s?", s)[:-1]
['this', 'that', 'talk', 'love', 'hate', 'good', 'bad', 'all good']
于 2013-07-03T01:50:47.173 回答
1

您可以使用前瞻:

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

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

于 2013-07-03T01:51:21.530 回答
1

您可以使用:

re.findall(r'[\w\s]+', s)
于 2014-02-04T14:22:10.650 回答
0

+关闭引号之前)在括号之外。把它放在里面,因此:

re.findall(r"\s*([a-z ]+)[ ,;.]+", s)
于 2013-07-03T01:42:08.783 回答