繁体   English   中英

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

[英]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

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

让我用简单的英语说一下 RegEx 演示在暗示什么并实际回答您的实际问题:

  1. ([0-9-]*)匹配 0 个或多个数字字符或-字符。 当没有电话存在时,就是匹配0 个字符的情况。 但请注意操作词匹配,即它仍然是匹配。 因此, mo.group(1)返回''
  2. ([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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM