下面输入条目列表
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 是可选的。
