[英]regex groups: How to get the desired output with a more specific match pattern?
以下输入条目列表
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”)。
为什么“*”导致与“?”不同的分组。 是的,在打印结果时处理“无”对我来说是微不足道的,但我很想知道分组结果差异的原因。
((?:[0-9]{3}-[0-9]{4})?)\s*(\w*),\s*(\S.*$)
试试这个。看演示。
https://regex101.com/r/Qx6ylw/1
在书中示例group
不是可选的……它的内容是……在您的正则表达式group
是可选的。
使用明智的空白修剪,一个简单的查找和替换示例是这样的:
查找: ^((?:\\d+(?:-\\d+)+)?)\\s*([^,]*?)\\s*,\\s*(.*)
替换\\3 \\2 \\1
让我用简单的英语说一下 RegEx 演示在暗示什么并实际回答您的实际问题:
([0-9-]*)
匹配 0 个或多个数字字符或-
字符。 当没有电话存在时,就是匹配0 个字符的情况。 但请注意操作词匹配,即它仍然是匹配。 因此, mo.group(1)
返回''
。([0-9]{3}-[0-9]{4})?
尝试以特定格式匹配电话号码,但此匹配是可选的。 当输入中不存在电话号码时,匹配不存在,因此mo.group(1)
返回None
。此代码解决了您的问题:
for i in l:
mo = re.search(r"([0-9]{3}-[0-9]{4})?\s*(\w*),\s*(\S.*$)", i)
if mo:
if mo.group(1):
print("{} {} {}".format(mo.group(3), mo.group(2), mo.group(1)))
else:
print("{} {}".format(mo.group(3), mo.group(2)))
输出:
Allison Neu 555-8396
C. Montgomery Burns
Lionel Putz 555-5299
Homer Jay Simpson 555-7334
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.