我想匹配电话号码,并返回整个电话号码但只返回数字。这是一个例子:
(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()
但由于某种原因它只打印一个空元组?我在这里失踪的显而易见的事情是什么?感谢。
答案 0 :(得分:5)
由于不拥有任何捕获组,您的结果为空,请参阅documentation了解详情。
您应该将其更改为group()
,现在您将获得第一个数字作为匹配。但这是不你想要的东西,因为引擎在遇到非数字字符时会停止并将匹配返回到那里。
您只需删除所有非数字字符:
re.sub('[^0-9]', '', '(555)-555-5555')
取消范围0-9,因此正则表达式匹配不数字的任何内容,然后用空字符串替换它。
答案 1 :(得分: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
答案 2 :(得分:1)
最简单的方法是:
>>> import re
>>> s = "(555)-555-5555"
>>> x = re.sub(r"\D+", r"", s)
>>> x
'5555555555'