2015-12-22 3 views
3

если у меня есть следующая строка 'некоторые цифры 66666666666666666667867866 и серийные номера 151283917503423 и 8888888', и я хочу найти 15-значное число (так только 151283917503423), как я могу сделать это так, чтобы он не совпал большее число, а также иметь дело с возможностью того, что строка может быть просто «151283917503423», поэтому я не могу ее идентифицировать, возможно, с пространством с обеих сторон?регулярное выражение соответствует точной схеме в строке

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

это возвращает как +66666666666666666667867866 и 151283917503423, но я хочу только последний

ответ

5

Использование word boundaries:

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.

+0

очень информативный .......: D – repzero

4

Вы должны использовать границы слов, чтобы убедиться, что вы не совпадают ненужный текст на обе стороны от матча:

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

gr8: D .......... – repzero

2

Включить границы слов. Пусть s будет вашей строкой. Вы можете использовать

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

где \ Ъ утверждает границу слова (^ \ ш | \ ш $ | \ W \ ш | \ ш \ W)

+0

приятный ........... – repzero

1

Поскольку границы слов \b содержат 2 утверждения каждого, я хотел бы использовать один утверждение
вместо этого.

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

должны быть быстрее?

+0

симпатичный ....... ............... – repzero

Смежные вопросы