在字符串中匹配精确的正则表达式模式

3
如果我有以下字符串“some numbers 66666666666666666667867866 and serial 151283917503423 and 8888888”,我想找到15位数字(只有151283917503423),如何使它不匹配更大的数字,并处理字符串可能只是“151283917503423”的可能性,因此我不能通过它可能包含两侧的空格来识别它?
serial = re.compile('[0-9]{15}')
serial.findall('some numbers 66666666666666666667867866 and serial 151283917503423 and 8888888')

这个返回了66666666666666666667867866和151283917503423,但我只想要后者。

4个回答

5

使用单词边界

serial = re.compile(r'\b[0-9]{15}\b')
\b匹配一个空字符串,但仅限于单词的开头或结尾。单词被定义为由字母数字或下划线字符组成的序列,因此单词的结尾由空格或非字母数字、非下划线字符表示。请注意,正式地说,\b被定义为\w和\W字符(或反之亦然)之间的边界,或者在字符串的开头/结尾与\w之间的边界,所以被认为是字母数字的确切字符集取决于UNICODE和LOCALE标志的值。例如,r' \ bfoo \ b'匹配' foo ',' foo。','(foo)',' bar foo baz '而不匹配' foobar '或' foo3 '。在字符范围内,\b代表退格字符,以兼容Python的字符串文字。

4

您需要使用单词边界来确保您不会匹配到所需匹配文本的左右不相关文本:

>>> serial = re.compile(r'\b\d{15}\b')
>>> serial.findall('some numbers 66666666666666666667867866 and serial 151283917503423 and 8888888')
['151283917503423']

2

包括单词边界。假设s是你的字符串。你可以使用

 >>> re.findall(r'\b\d{15}\b' ,s)
 ['151283917503423']
其中 \b 表示单词边界(^\w|\w$|\W\w|\w\W)

1
由于单词边界\b包含2个断言,因此我会改用单个断言。

(?<![0-9])[0-9]{15}(?![0-9])

应该更快吧?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接