正则表达式匹配字符串

时间:2015-12-22 22:06:30

标签: python regex

如果我有以下字符串'一些数字66666666666666666667867866和序列号151283917503423和8888888'我想找到15位数字(所以只有151283917503423)我怎么做它以使它不匹配更大的数字并且还处理字符串可能只是' 151283917503423'因此,我可能无法通过两侧可能包含空格来识别它?

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

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

4 个答案:

答案 0 :(得分:5)

使用word boundaries

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

\ b匹配空字符串,但仅限于a的开头或结尾   字。单词被定义为字母数字或下划线的序列   字符,所以单词的结尾用空格或a表示   非字母数字,非下划线字符。请注意,\ b是正式的   定义为\ w和\ W字符之间的边界(或副   反之亦然),或者在\ w和字符串的开头/结尾之间,所以   被认为是字母数字的精确字符集取决于   UNICODE和LOCALE标志的值。例如,r'\ bfoo \ b'   匹配'foo','foo。','(foo)','bar foo baz'但不是'foobar'或   'foo3'。在字符范围内,\ b表示退格   character,与Python的字符串文字兼容。

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

包含字边界。让currentList = [4-16, 2-14, 6-8, 10-22] max_start=10 >= min_end=8 update start values to be 10 and replace 6-8 with next entry 12-20. currentList = [10-16, 10-14, 12-20, 10-22] max_start=12 <= min_end=14 add max_start-min_end to output and update start values to 14. Output=[12-14] currentList = [14-16, 17-24, 14-20, 14-22] max_start=17 >= min_end=16 update start values to be 17 and replace 14-16 with 18-25 currentList = [18-25, 17-24, 17-20, 17-22] max_start=18 <= min_end=20 add max_start-min_end to output and update start values to 20. Output=[12-14, 18-20] currentList = [20-25, 2-24, - , 2-22] Terminate now since there are no more entry from person 3. 成为你的字符串。你可以使用

s

其中\ b断言字边界(^ \ w | \ w $ | \ W \ w | \ w \ W)

答案 3 :(得分:1)

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

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

应该更快?