如何从字符串中获取N个连续数字?

时间:2019-05-28 10:18:52

标签: regex python-3.x string regex-lookarounds regex-group

我试图从匹配的字符串中获取连续的4位数字。

当我尝试docker network create elk docker run --net elk --name elasticsearch ... docker run --net elk --name kibana \ -e ELASTICSEARCH_URL=http://elasticsearch:9200 ... 时,它会返回re.sub('[^\d]+', ',', "abc 23 [1981] ghj [5656]")。因此,当我执行,23,1981,5656,时,它会返回错误re.sub('[\d]{4}+', ',', "abc 23 [2021]")

由于我保留了"multiple repeat at position 7",所以它不应该匹配4次出现的{4}并返回[\d]吗?

2 个答案:

答案 0 :(得分:2)

如果您只想使用正则表达式,则需要一些技巧。

相反,您可以使用lambda有条件地用逗号替换不是四位数的字符串部分,并按原样保留这四位数。尝试使用此Python代码,

import re

s = "abc 23 [1981] ghj [5656]"
print(re.sub(r'\b(\d{4})\b|((?!\b\d{4}\b).)+', lambda x: x.group() if x.group(1) else ',', s))

按照您的需要打印,

,1981,5656,

我们在这里所做的是,使用group1中的\b(\d{4})\b捕获四位数字,并使用此((?!\b\d{4}\b).)+ regex捕获任何其他没有四位数字的字符,我们进行了条件替换,如果第一个替换匹配,则group1不为空,因此将其替换为匹配的文本;如果group1为空,则表示第二个正则表达式匹配,因此应使用逗号替换。

答案 1 :(得分:1)

使用re.findall

例如:

import re

s = "abc 23 [1981] ghj [5656]"
print(re.findall(r"\[(\d{4})\]", s))

输出:

['1981', '5656']