我试图从匹配的字符串中获取连续的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]
吗?
答案 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']