我想将带有括号和第六位和第七位数之间的连字符的电话号码转换为10个没有格式化的数字。这段代码可以解决这个问题,但它很笨拙,我想知道是否有更有效的方法?
谢谢!
phone_number = "(251) 342-7344"
phone_number=phone_number.replace("(","")
phone_number=phone_number.replace(")","")
phone_number=phone_number.replace(" ","")
phone_number=phone_number.replace("-","")
print phone_number
答案 0 :(得分:10)
您可以使用str.translate
:
>>> from string import punctuation,whitespace
>>> strs = "(251) 342-7344"
>>> strs.translate(None, punctuation+whitespace)
'2513427344'
使用str.isdigit
和str.join
:
>>> "".join([x for x in strs if x.isdigit()])
'2513427344'
时间比较:
>>> strs = "(251) 342-7344"*1000
>>> %timeit strs.translate(None, punctuation+whitespace)
10000 loops, best of 3: 116 us per loop #clear winner
>>> %timeit "".join([x for x in strs if x.isdigit()])
100 loops, best of 3: 4.42 ms per loop
>>> %timeit re.sub(r'[^\d]', '', strs)
100 loops, best of 3: 2.19 ms per loop
答案 1 :(得分:6)
我会去:
import re
phone_number = "(251) 342-7344"
print re.sub(r'[^\d]', '', phone_number)
# 2513427344
答案 2 :(得分:1)
包含电池的功能版本。
>>> ''.join([x for x in phone_number if x.isdigit()])
'2513427344'
“高效”,如果你用代码行测量,我想。你必须要判断你正在寻找什么样的效率。
答案 3 :(得分:0)
您可以使用Regular Expression删除除数字以外的任何内容。
>>> import re
>>> numbers_only = re.compile(r'[^\d]')
>>> numbers_only.sub('', '(251) 342-7344')