【问题标题】:Regex: How to capture a sequence of 6-12 digits that may be separated by spaces without capturing any trailing space正则表达式:如何捕获可能由空格分隔的 6-12 位数字序列而不捕获任何尾随空格
【发布时间】:2020-10-08 14:31:46
【问题描述】:

我正在尝试捕获一个由空格分隔的 6-12 位数字序列,如下所示(末尾的字母 D 只是一个示例。字符串末尾可能没有任何内容,或者有某种标点符号或字母)。

123 345 4567 89 D
123 345456789 D

我目前的尝试如下:

尝试 1:使用惰性量词 *?

"\b(?:\d *?){6,12}\b"

这样,它将成功返回此字符串123 345456789 D 中的所有数字,但无法完全捕获123 345 4567 89 D 中的数字(仅捕获前两组)-我假设这是因为第一个由于惰性量词,两组数字(即123 345)满足6位数的最低要求,因此一旦满足最低要求,正则表达式就会停止。

尝试2:不使用惰性量词(仅使用*):

"\b(?:\d *){6,12}\b"

这样,上面示例中的所有数字组都被捕获。但是,这个正则表达式也会捕获最后一个数字和字母 D 之间的尾随空格。

所以我想知道是否有一种方法可以捕获所有数字而不包括尾随空格。我在 Python 中这样做,所以一个想法是使用第二个正则表达式但去掉任何尾随返回匹配后的空格,但看起来真的很不雅。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    这样就可以了:((?:\d\s*){5,11}\d?)

    见:https://regex101.com/r/qcRbip/1

    【讨论】:

    • 我会试一试的!谢谢
    • 应该改为((?:\d\s*){5,11}\d)(没有?)。使用?,它还将匹配一个 5 位数字的序列,但我需要的最小值是 6
    【解决方案2】:

    我无法重现您的问题。你的尝试 2 作品为我找到了。这是我的代码:

    s = "123 345 4567 89 D"
    re.findall("(?:\d *?){6,12}", s)
    
    ['123 345', '4567 89']
    
    
    d = "123 345456789 D"
    re.findall("(?:\d *?){6,12}", d)
    
    ['123 345456789']
    

    【讨论】:

    • 对不起,我在尝试 2 中给出的正则表达式与第一个相同,因为我忘记删除惰性量词。我已经更正了。
    【解决方案3】:
    "\b\d(?: *\d){5,11}\b"
    

    【讨论】:

    • 纯代码答案是低质量的答案。
    【解决方案4】:

    (?:\d *) 中的量词是贪心的,如果有空格就会匹配,最后也会匹配。

    在这部分(?:\d *?) 中,用于匹配空间的量词是非贪婪的,因此在最低要求 6 次之后会有匹配。

    \b\d(?: *\d){5,11}\b
    
    • \b一个字边界
    • 匹配第一位数字
    • (?: *\d){5,11} 重复 5 - 11 次,可选空格和一个数字
    • \b一个字边界

    Regex demo

    【讨论】:

      猜你喜欢
      • 2015-02-27
      • 2017-08-01
      • 1970-01-01
      • 2016-08-13
      • 2016-09-15
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 2020-05-07
      相关资源
      最近更新 更多