繁体   English   中英

Python中的正则表达式findall()

[英]regular expression findall() in Python

如果我有这个字符串:

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()应该找到所有结果,不是吗? 有人可以解释这种奇怪的行为吗?

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

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

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

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

您可以使用前瞻:

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

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

您可以使用:

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

+ (在右引号之前)在括号之外。 将其放入其中,因此:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM