当前位置:  开发笔记 > 编程语言 > 正文

电话号码到Python中的链接

如何解决《电话号码到Python中的链接》经验,为你挑选了1个好方法。

我正在编写一段代码将手机号码转换成手机链接 - 我已经知道了,但感觉非常脏.

import re
from string import digits

PHONE_RE = re.compile('([(]{0,1}[2-9]\d{2}[)]{0,1}[-_. ]{0,1}[2-9]\d{2}[-_. ]{0,1}\d{4})')

def numbers2links(s):
    result = ""
    last_match_index = 0
    for match in PHONE_RE.finditer(s):
          raw_number = match.group()
          number = ''.join(d for d in raw_number if d in digits)
          call = '%s' % (number, raw_number)
          result += s[last_match_index:match.start()] + call
          last_match_index = match.end()
    result += s[last_match_index:]
    return result

>>> numbers2links("Ghost Busters at (555) 423-2368! How about this one: 555 456 7890! 555-456-7893 is where its at.")
'Ghost Busters at (555) 423-2368! How about this one: 555 456 7890! 555-456-7893 is where its at.'

无论如何,我可以重构正则表达式或正在使用的正则表达式方法,使这个更清洁?

更新

为了澄清,我的问题不是关于我的正则表达式的正确性 - 我意识到它是有限的.相反,我想知道是否有人对电话号码的链接中的替代方法有任何评论 - 无论如何我可以使用re.replace或类似的东西而不是我拥有的字符串hackery?



1> Triptych..:

不错的第一次采取:)我认为这个版本更具可读性(并且可能快一点).这里要注意的关键是使用re.sub.让我们远离令人讨厌的比赛指数......

import re

PHONE_RE = re.compile('([(]{0,1}[2-9]\d{2}[)]{0,1}[-_. ]{0,1}[2-9]\d{2}[-_.  ]{0,1}\d{4})')
NON_NUMERIC = re.compile('\D')

def numbers2links(s):

   def makelink(mo):
      raw_number = mo.group()
      number = NON_NUMERIC.sub("", raw_number)
      return '%s' % (number, raw_number)

   return PHONE_RE.sub(makelink, s)


print numbers2links("Ghost Busters at (555) 423-2368! How about this one: 555 456 7890! 555-456-7893 is where its at.")

注意:在我的练习中,我没有注意到加速预编译简单的正则表达式,就像我正在使用的两个,即使你使用它们数千次.re模块可能有某种内部缓存 - 没有费心阅读源和检查.

另外,我替换了检查每个字符的方法,看看它是否string.digits与另一个字符在一起,re.sub()因为我认为我的版本更具可读性,不是因为我确信它的表现更好(尽管可能).

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有