繁体   English   中英

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

[英]regex match exact pattern within string

如果我有以下字符串'某些数字66666666666666666667867866和序列号151283917503423和8888888'并且我想找到15位数字(因此只有151283917503423)我该怎么做才能使它与更大的数字不匹配并处理可能性字符串可以只是'151283917503423'因此我无法识别它可能在两边都包含空格?

serial = re.compile('[0-9]{15}')
serial.findall('some numbers 66666666666666666667867866 and serial 151283917503423 and 8888888')

这将返回66666666666666666667867866和151283917503423,但我只想要后者

使用单词边界

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的字符串文字兼容。

您需要使用单词边界来确保您不匹配匹配任何一方的不需要的文本:

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

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

 >>> re.findall(r'\b\d{15}\b' ,s)
 ['151283917503423']

其中\\ b断言一个单词边界(^ \\ w | \\ w $ | \\ W \\ w | \\ w \\ W)

由于字边界\\b每个包含2个断言,我将使用单个断言
代替。

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

应该更快?

暂无
暂无

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

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