以下输入条目列表
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”对我来说是微不足道的,但是我很想知道分组结果不同的原因。
让我用简单的英语说正则表达式演示所暗示的内容,并实际上回答您的实际问题:
([0-9-]*)
匹配0个或多个数字或-
字符。如果没有电话,则匹配0个字符。但请注意,操作性单词匹配,即它仍然是匹配项。因此,mo.group(1)
return ''
。([0-9]{3}-[0-9]{4})?
尝试以特定格式匹配电话号码,但是此匹配是可选的。当输入中不存在电话号码时,不存在匹配项,因此mo.group(1)
返回None
。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句