首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3用dict中的数据替换部分字符串。

Python 3用dict中的数据替换部分字符串。
EN

Stack Overflow用户
提问于 2018-02-13 15:05:03
回答 4查看 130关注 0票数 3

我需要把电话转换成国际格式。我有一个电话号码示例列表

代码语言:javascript
复制
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相结合,我的想法是用匹配的替换来制作一本字典,如下所示:

代码语言:javascript
复制
repl_dict = {
  '01': '+461',
  '02': '+462',
  '03': '+463',
  '04': '+464',
  '05': '+465',
  '06': '+466',
  '07': '+467',
  '08': '+468',
  '09': '+469',
  '00': '+'
}

到目前为止我的尝试是:

代码语言:javascript
复制
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])  
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-13 15:17:02

\d*结尾的正则表达式将匹配整个数字,因此在dict中找不到条目。而且,在对sub的调用中,似乎有一个无与伦比的父类和一个太多的sub

您可以简化对^00?的regex和对{'00': '+', '0': '+46'}的替换。这将检查这个数字是以一个还是两个0开头,从而使替换dict变得更简单、更少重复。

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
+46707262078
+46706332602Ring via Mitel 
+4665017063
+46730522807Ring via Mitel 
+46733165812

如果您只需要数字部分,则可以使用第二个正则表达式(如[0-9+]* )对数字进行预处理或后置处理。

票数 3
EN

Stack Overflow用户

发布于 2018-02-13 15:41:36

这是基于repl_dict的天真方法,正如在您的问题中所给出的。

代码语言:javascript
复制
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和模式提供了一个更好的方法。

票数 1
EN

Stack Overflow用户

发布于 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()

代码语言:javascript
复制
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]))

输出:

代码语言:javascript
复制
[(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')]

代码演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48769808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档