从字母数字字符串中查找并提取一串完全'n'个连续的连续数字

时间:2016-09-06 16:35:28

标签: regex

给定一个任意字母数字字符串:

The quick brown 12345678901234 fox jumped over 987654321, on his second try.

如果字符串中的其他数字长于9位,那么正则表达式可以提取长度正好为9位的连续数字字符串吗?

即,获取987654321并忽略12345678901234

规则是“获取长度为9个字符的任意数字字符串,无论是无界的,还是有界的,都是由0-9以外的任何字符限定的。”

3 个答案:

答案 0 :(得分:3)

这只匹配您的目标 (无需与群组玷污):

(?<!\d)\d{9}(?!\d)

请参阅live demo

这使用环绕声来断言&#34;数字边界&#34;两端。环顾四周不要消耗任何东西,因此任何一方的角色都不是比赛的一部分 - 只有你的目标号码匹配。

此外,通过使用否定查看数字,而不是肯定环顾数字,边界也匹配输入的开始/结束 - 因此输入的开头或结尾的9位数字仍然匹配。

答案 1 :(得分:0)

当然:

\b\d{9}\b
# a word boundary (ie space, punctuation, comma)
# exactly nine consecutive digits
# another boundary

a demo on regex101.com

<小时/> 提供另一个例子:

\D(\d{9})\D
# not a digit
# nine consecutive digits
# not a digit

使用this one,您需要再次使用$1。但这取决于数字的位置。后者在字符串的开头或开始处不起作用(每侧需要正好一个字符)。数字的最佳选择是\b

答案 2 :(得分:0)

使用\b绑定字符串不适用于The quick brown 12345678901234 fox jumped over xx987654321xx, on his second try(以非数字为界),这样做:

(?:^|[^\d])(\d{9})(?:$|[^\d])

(开始/结束或非数字的非捕获组)

demo here

编辑:更简单的“现代”风格:

(?:^|\D)(\d{9})(?:$|\D)

Python测试(捕获几个9位数组):

import re
p=re.compile(r"(?:^|\D)(\d{9})(?:$|\D)")
print(re.findall(p,"The quick brown 12345678901234 fox jumped over 987654321dd, 123456789"))

给出:

['987654321', '123456789']