正则表达式组:如何通过更具体的匹配模式获得所需的输出?

2020年

以下输入条目列表

l = ["555-8396 Neu, Allison", 
     "Burns, C. Montgomery", 
     "555-5299 Putz, Lionel",
     "555-7334 Simpson, Homer Jay"]

预计将转换为:

Allison Neu 555-8396
C. Montgomery Burns  
Lionel Putz 555-5299 
Homer Jay Simpson 555-7334

我尝试了以下方法:

for i in l:
    mo = re.search(r"([0-9]{3}-[0-9]{4})?\s*(\w*),\s*(\S.*$)", i)
    if mo:
        print("{} {} {}".format(mo.group(3), mo.group(2), mo.group(1)))

并导致以下错误输出(注意输出第二行中的“无”)

Allison Neu 555-8396
C. Montgomery Burns None
Lionel Putz 555-5299
Homer Jay Simpson 555-7334

但是,电子书中提到的以下解决方案确实提供了所需的输出:

for i in l:
    mo = re.search(r"([0-9-]*)\s*([A-Za-z]+),\s+(.*)", i)
    print(mo.group(3) + " " + mo.group(2) + " " + mo.group(1))

简而言之,归结为2个reg exp搜索的groups()输出的差异:

>>> mo = re.search(r"([0-9]{3}-[0-9]{4})?\s*(\w*),\s*(\S.*$)", "Burns, C. Montgomery")
>>> mo.groups()
(None, 'Burns', 'C. Montgomery')

>>> mo = re.search(r"([0-9-]*)\s*(\w*),\s*(\S.*$)", "Burns, C. Montgomery")
>>> mo.groups()
('', 'Burns', 'C. Montgomery')

无vs''

我想使用[0-9] {3}-[0-9] {4}来更准确地匹配电话号码格式,而不是使用可以匹配任意数字和-组合的[0-9-] *(例如:“ 0-1-2”或“ 1-23”)。

为什么“ *”导致的分组不同于“?”。是的,在打印结果时照顾“ None”对我来说是微不足道的,但是我很想知道分组结果不同的原因。

布布

让我用简单的英语说正则表达式演示所暗示的内容,并实际上回答您的实际问题:

  1. ([0-9-]*)匹配0个或多个数字或-字符。如果没有电话,则匹配0个字符。但请注意,操作性单词匹配,即它仍然是匹配项。因此,mo.group(1)return ''
  2. ([0-9]{3}-[0-9]{4})?尝试以特定格式匹配电话号码,但是此匹配是可选的当输入中不存在电话号码时,不存在匹配项,因此mo.group(1)返回None

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章