以下输入条目列表
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
但是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”)。你知道吗
为什么“*”会导致与“?”不同的分组。 是的,在打印结果时处理“无”对我来说是微不足道的,但是我很想知道分组结果差异的原因。你知道吗
使用明智的空格修剪,一个简单的查找和替换示例如下:
查找:
^((?:\d+(?:-\d+)+)?)\s*([^,]*?)\s*,\s*(.*)
替换
\3 \2 \1
https://regex101.com/r/oo0NWy/1
试试看这个。看到了吗演示。你知道吗
https://regex101.com/r/Qx6ylw/1
在书中,示例
group
不是可选的…它的内容是…在正则表达式中group
是可选的。你知道吗让我用通俗易懂的英语说出RegEx演示所暗示的内容,并实际回答您的实际问题:
([0-9-]*)
匹配0个或多个数字字符或-
字符。当没有电话时,将出现匹配0个字符的情况。但请注意操作词匹配,即它仍然是匹配。因此,mo.group(1)
返回''
。你知道吗([0-9]{3}-[0-9]{4})?
尝试以特定格式匹配电话号码,但此匹配是可选的。当输入中不存在电话号码时,匹配项不存在,因此mo.group(1)
返回None
。你知道吗相关问题 更多 >
编程相关推荐