2

我想将带有括号和连字符的电话号码在第六位和第七位之间转换为 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
4

4 回答 4

10

您可以使用str.translate

>>> from string import punctuation,whitespace
>>> strs = "(251) 342-7344"
>>> strs.translate(None, punctuation+whitespace)
'2513427344'

使用str.isdigitstr.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
于 2013-07-01T14:49:38.887 回答
6

我会去:

import re

phone_number = "(251) 342-7344"
print re.sub(r'[^\d]', '', phone_number)
# 2513427344
于 2013-07-01T14:50:37.667 回答
1

包含电池的功能版本。

>>> ''.join([x for x in phone_number if x.isdigit()])
'2513427344'

我猜,如果您通过代码行来衡量,那么“高效”。您必须判断您正在寻找什么样的效率。

于 2013-07-01T14:58:02.653 回答
0

您可以使用正则表达式去除除数字之外的任何内容。

>>> import re
>>> numbers_only = re.compile(r'[^\d]')
>>> numbers_only.sub('', '(251) 342-7344')
于 2013-07-01T14:51:13.940 回答