我需要把电话转换成国际格式。我有一个电话号码示例列表
rows = [
(datetime.time(20, 35, 30), '0707262078',),
(datetime.time(20, 38, 18), '+46706332602',),
(datetime.time(20, 56, 35), '065017063'),
(datetime.time(21, 45, 1), '+46730522807',),
(datetime.time(22, 13, 47), '0046733165812')
]我需要用+467替换所有以ex 07开头的数字,用+466替换所有06,用+替换00。对于上面的例子,我需要这个数字来生成0707262078到+46707262078,065017063到+4665017063和0046733165812到+46733165812。
不知道是否可能只在regex中这样做,或者我是否需要用其他代码来完成它。
一直在尝试将re.sub与lamda相结合,我的想法是用匹配的替换来制作一本字典,如下所示:
repl_dict = {
'01': '+461',
'02': '+462',
'03': '+463',
'04': '+464',
'05': '+465',
'06': '+466',
'07': '+467',
'08': '+468',
'09': '+469',
'00': '+'
}到目前为止我的尝试是:
import re
rows = [
(datetime.time(20, 35, 30), '0707262078',),
(datetime.time(20, 38, 18), '+46706332602Ring via Mitel ',),
(datetime.time(20, 56, 35), '065017063'),
(datetime.time(21, 45, 1), '+46730522807Ring via Mitel ',),
(datetime.time(22, 13, 47), '0046733165812')
]
repl_dict = {
'01': '+461',
'02': '+462',
'03': '+463',
'04': '+464',
'05': '+465',
'06': '+466',
'07': '+467',
'08': '+468',
'09': '+469',
'00': '+'
}
for row in rows:
regex = re.compile(r'^\d{1}[0-9](\d*)'), re.S
DialedNumber = regex.sub(lambda match: repl_dict.get(match.group(0), row[1]), row[1], row[1]) 发布于 2018-02-13 15:17:02
以\d*结尾的正则表达式将匹配整个数字,因此在dict中找不到条目。而且,在对sub的调用中,似乎有一个无与伦比的父类和一个太多的sub。
您可以简化对^00?的regex和对{'00': '+', '0': '+46'}的替换。这将检查这个数字是以一个还是两个0开头,从而使替换dict变得更简单、更少重复。
rows = [(datetime.time(20, 35, 30), '0707262078',), (datetime.time(20, 38, 18), '+46706332602Ring via Mitel ',), (datetime.time(20, 56, 35), '065017063'), (datetime.time(21, 45, 1), '+46730522807Ring via Mitel ',), (datetime.time(22, 13, 47), '0046733165812')]
repl_dict = {'00': '+', '0': '+46'}
regex = re.compile(r'^00?')
for date, number in rows:
print(regex.sub(lambda match: repl_dict.get(match.group(0)), number))输出:
+46707262078
+46706332602Ring via Mitel
+4665017063
+46730522807Ring via Mitel
+46733165812如果您只需要数字部分,则可以使用第二个正则表达式(如[0-9+]* )对数字进行预处理或后置处理。
发布于 2018-02-13 15:41:36
这是基于repl_dict的天真方法,正如在您的问题中所给出的。
def repl(match):
return repl_dict[match.group(0)]
pat = '^(' + '|'.join(repl_dict) + ')'
new_rows = [(tm, re.sub(pat, repl, ph)) for (tm, ph) in rows]tobias的答案通过改进您的repl_dict和模式提供了一个更好的方法。
发布于 2018-02-13 15:50:18
Regex:^[0-9]{2}
详细信息:
^断言行开始处的位置[]匹配列表中的单个字符{n}与n时间完全匹配Python代码
通过@tobias_k,可以使用repl_dict.get(m.group(), m.group())而不是repl_dict.get(m.group()) or m.group()。
regex = re.compile(r'^[0-9]{2}')
for i in range(len(rows)):
rows[i] = (rows[i][0], regex.sub(lambda m: repl_dict.get(m.group()) or m.group(), rows[i][1]))输出:
[(datetime.time(20, 35, 30), '+46707262078'), (datetime.time(20, 38, 18), '+46706332602Ring via Mitel '), (datetime.time(20, 56, 35), '+4665017063'), (datetime.time(21, 45, 1), '+46730522807Ring via Mitel '), (datetime.time(22, 13, 47), '+46733165812')]https://stackoverflow.com/questions/48769808
复制相似问题