繁体   English   中英

正则表达式:如何捕获可能由空格分隔的 6-12 位数字序列而不捕获任何尾随空格

[英]Regex: How to capture a sequence of 6-12 digits that may be separated by spaces without capturing any trailing space

我正在尝试捕获可能由空格分隔的 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 中这样做,所以有人认为是使用第二个正则表达式,但在返回匹配项后去除任何尾随空格,但这看起来真的很不雅观。

这将做到: ((?:\d\s*){5,11}\d?)

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

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

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

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

正则表达式演示

我无法重现您的问题。 你的尝试 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']
"\b\d(?: *\d){5,11}\b"

暂无
暂无

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

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