Почему в этом регулярном выражении python не удается найти полные номера телефонов? [dубликат]

Я исправил это, переустановив инструмент Gnome Tweak Tool и перезапустив Gnome Shell.

10
задан 10 August 2015 в 19:01

1 ответ

Здесь есть две вещи:

re.findall возвращает захваченные тексты, если шаблон регулярного выражения содержит группы захвата, в нем часть r'\\.' в вашем шаблоне совпадает с двумя последовательными символами, \ и любой символ, отличный от новой строки.

См. ссылку findall:

Если одна или несколько групп присутствуют в шаблоне, верните список групп; это будет список кортежей, если шаблон имеет более одной группы. Пустые совпадения включаются в результат, если они не касаются начала другого матча.

Обратите внимание, что для того, чтобы re.findall возвращали только совпадающие значения, вы можете обычно

re.findall возвращать захваченные тексты, если шаблон регулярного выражения содержит группы захвата в нем преобразовать все группы захвата в не-захват (то есть заменить ( на (?:), если не будут обратные ссылки, которые относятся к значениям группы в шаблоне (см. ниже) часть r'\\.' в вашем

В вашем случае findall возвратил все захваченные тексты, которые были пустыми, потому что у вас \\ в r'', который пытался сопоставить литерал \.

Чтобы соответствовать номерам, вам нужно использовать

-?\d*\.?\d+

Регулярное выражение:

преобразует все группы захвата в не захватывающие (что заменяет ( на (?:), если нет обратных ссылок, которые относятся к групповым значениям в шаблоне (см. ниже) \d* - Необязательные цифры \.? - Дополнительный десятичный разделитель \d+ - 1 или более цифр.

См. findall ссылка

Вот демон IDEONE:

import re
s = r'abc123d, hello 3.1415926, this is my book'
pattern = r'-?\d*\.?\d+'
L = re.findall(pattern, s)
print(L)
8
ответ дан 15 August 2018 в 16:40

Другие вопросы по тегам:

Похожие вопросы: