Skip to main content
 首页 » 编程设计

python之正则表达式组 : How to get the desired output with a more specific match pattern

2025年05月04日28birdshome

下面输入条目列表

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))) 

它会导致以下错误输出(注意输出第二行中的“None”)

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

然而e-book中提到了以下解决方案确实提供了所需的输出:

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') 

无与''

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

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

请您参考如下方法:

((?:[0-9]{3}-[0-9]{4})?)\s*(\w*),\s*(\S.*$) 

试试这个。查看演示。

https://regex101.com/r/Qx6ylw/1

在书中的示例中,group 不是可选的……它的内容是……在您的正则表达式中,group 是可选的。