2015-10-06 2 views
2

Я хочу сопоставить номера телефонов и вернуть весь номер телефона, но только цифры. Вот пример:Как вернуть регулярное выражение как целую строку?

(555)-555-5555 
555.555.5555 

Но я хочу использовать регулярные выражения, чтобы вернуться только:

5555555555 

Но, по какой-то причине я не могу получить цифры должны быть возвращены:

import re 
phone_number='(555)-555-5555' 

regex = re.compile('[0-9]') 
r = regex.search(phone_number) 
regex.match(phone_number) 
print r.groups() 

Но почему-то это просто печатает пустые кортежи? Какая очевидная вещь мне здесь не хватает? Благодарю.

+2

'compimle'? Опубликуйте фактический код, не вводите его здесь. –

+1

Учебник может быть вам полезен, например: https://docs.python.org/2/howto/regex.html –

ответ

5

Вы получаете пустой результат, потому что у вас нет есть какие-либо группы захвата, см. documentation для деталей.

Вместо этого вы должны изменить его на group(), теперь вы получите первую цифру в качестве совпадения. Но это не, что вы хотите, потому что двигатель останавливается, когда он сталкивается с символом, отличным от цифр, и возвращает совпадение до тех пор, пока оно не появится.

Вы можете просто удалить всех нечисловых символов:

re.sub('[^0-9]', '', '(555)-555-5555') 

диапазон 0-9 отрицаются, поэтому регулярное выражение соответствует нибудь, что это не цифра, то она заменяет его пустой строка.

+0

Привет, я смотрел учебники и все такое, но меня все еще озадачивает: я знаю, что '^'означает« начало строки ». Но как это означает «не» в контексте «[^ 0-9]»? – Candic3

+1

@ Candic3, когда он помещается в начале класса символов, он просто означает «нет», поэтому '[^ 0123]' соответствует всем, что не является ** 0,1,2 или 3. Обратите внимание, однако, что '[1^2] 'соответствует 1,^или 2, это потому, что'^'не был помещен в начале, поэтому он теряет смысл. – Maroun

+0

Отличное объяснение, спасибо. – Candic3

3

Вы можете сделать это без, как регулярные выражения, используя str.join и str.isdigit:

s = "(555)-555-5555" 

print("".join([ch for ch in s if ch.isdigit()])) 
5555555555 

Если вы печатаете r.group() вы бы получить некоторые результаты, но используя поиск не правильный путь, чтобы найти все матчи, поиск вернутся первый матч, и поскольку вы ищете только одну цифру, он вернет 5, даже если '[0-9]+') соответствует одному или нескольким, вы все равно получите только первую группу последовательных цифр, то есть 555 в строке выше. Использование "".join(r.findall(s)) получило бы цифры, но это, очевидно, можно сделать с помощью str.digit.

Если бы вы знали потенциальные нецифровые символов, то str.translate будет лучшим подходом:

s = "(555)-555-5555" 

print(s.translate(None,"()-.")) 
5555555555 
1

Самый простой способ здесь:

>>> import re 
>>> s = "(555)-555-5555" 
>>> x = re.sub(r"\D+", r"", s) 
>>> x 
'5555555555'