正则表达式分组:如何通过更具体的匹配模式获得所需的输出?

2024-09-20 23:03:16 发布

您现在位置:Python中文网/ 问答频道 /正文

以下输入条目列表

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”)。你知道吗

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


Tags: reforsearchgroupgroupsmoallisonhomer
3条回答

使用明智的空格修剪,一个简单的查找和替换示例如下:

查找:^((?:\d+(?:-\d+)+)?)\s*([^,]*?)\s*,\s*(.*)
替换\3 \2 \1

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

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

试试看这个。看到了吗演示。你知道吗

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

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

让我用通俗易懂的英语说出RegEx演示所暗示的内容,并实际回答您的实际问题:

  1. ([0-9-]*)匹配0个或多个数字字符或-字符。当没有电话时,将出现匹配0个字符的情况。但请注意操作词匹配,即它仍然是匹配。因此,mo.group(1)返回''。你知道吗
  2. ([0-9]{3}-[0-9]{4})?尝试以特定格式匹配电话号码,但此匹配是可选的。当输入中不存在电话号码时,匹配项不存在,因此mo.group(1)返回None。你知道吗

相关问题 更多 >

    热门问题