如果我有这个字符串:
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()应该找到所有结果,不是吗?有人可以解释这种奇怪的行为吗?
答案 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)