【问题标题】:How to get N consecutive digits from a string?如何从字符串中获取N个连续数字?
【发布时间】:2019-05-28 10:18:52
【问题描述】:

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

当我尝试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]并返回,1981,5656,吗?

【问题讨论】:

  • print(re.findall(r"\d{4,}", s))?
  • @Rakesh 这将返回 ['1981', '5656'] 一个列表,然后我必须再次将其转换为字符串,而不是使用 regex.sub 来完成,以便它返回一个字符串
  • print(", ".join(re.findall(r"\[(\d{4})\]", s))) ?
  • @ShivamRaj:你不能在 Python 中量化一个量词,这就是为什么你会因为这个正则表达式 [\d]{4}+ 而出错。如果\d 单独在其中,您也不需要将\d 放入字符集中。你能清楚地说明你当前的输出和预期的输出吗?
  • @PushpeshKumarRajwanshi:如果没有+,我不会收到任何错误,而是会返回一些东西。在这样做re.sub('[^\d]+', ',', "abc 23 [1981] ghj [5656]") 我得到,23,1981,5656, 但我想要,1981,5656,

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


【解决方案1】:

如果你只想使用正则表达式,你想要的有点棘手。

相反,您可以使用 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).)+ 正则表达式捕获任何其他一个或多个没有四位数字的字符,然后我们进行条件替换,如果先交替匹配,则 group1 不为空,因此将其替换为匹配的文本,如果 group1 为空,则表示第二个正则表达式匹配,因此使用逗号替换它。

【讨论】:

    【解决方案2】:

    使用re.findall

    例如:

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

    输出:

    ['1981', '5656']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多