首页 > 解决方案 > python 正则表达式返回非捕获组

问题描述

我想从一封电子邮件中生成一个用户名:

例如:

getUsername("my-firstname.my-lastname@email.com")
mmylastn

这是getUsername代码:

def getUsername(email) :
   re.match(r"(.){1}[a-z]+.([a-z]{7})",email.replace('-','')).group()

如果我这样做,.group(1,2)我可以看到捕获的组是mand mylastn,所以一切都很好。但是 using.group()不仅返回捕获组,还返回它们之间的所有内容:myfirstnamemlastn

有人可以向我解释这种行为吗?

标签: pythonregex

解决方案


首先,.模式中的 a 是匹配除换行符之外的任何字符的元字符。您需要.在正则表达式模式中转义

此外,{1}限制量词总是多余的,您可以安全地从您拥有的任何正则表达式中删除它。

接下来,如果您需要获取mmylastn字符串作为结果,则不能使用match.group(),因为.group()获取的是整体匹配值,而不是连接的捕获组值。

所以,在你的情况下,

  • 先检查是否有匹配,尝试访问None.groups()会抛出异常
  • 然后加入match.groups()

您可以使用


import re
def getUsername(email) :
    m = re.match(r"(.)[a-z]+\.([a-z]{7})",email.replace('-',''))
    if m:
        return "".join(m.groups())
    return email

print(getUsername("my-firstname.my-lastname@email.com"))

请参阅 Python 演示。


推荐阅读