如果我有以下字符串'一些数字66666666666666666667867866和序列号151283917503423和8888888'我想找到15位数字(所以只有151283917503423)我怎么做它以使它不匹配更大的数字并且还处理字符串可能只是' 151283917503423'因此,我可能无法通过两侧可能包含空格来识别它?
serial = re.compile('[0-9]{15}')
serial.findall('some numbers 66666666666666666667867866 and serial 151283917503423 and 8888888')
这将返回66666666666666666667867866和151283917503423,但我只想要后者
答案 0 :(得分:5)
>>> 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])
应该更快?