Python正则表达式返回非捕获组

3
我想通过电子邮件生成一个用户名,规则如下:

  • 名字的第一个字母
  • 姓氏的前7个字母

例如:

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

这里是 getUsername 的代码:

def getUsername(email) :
   re.match(r"(.){1}[a-z]+.([a-z]{7})",email.replace('-','')).group()
  • 使用email.replace('-','')来去掉-符号。
  • 用正则表达式捕获我上面描述的两个组。

如果我使用.group(1,2),我可以看到捕获的组是mmylastn,所以一切都很好。 但是使用.group()不仅返回捕获组,还包括它们之间的所有内容: myfirstnamemlastn

有人能解释一下这种行为吗?


1
首先,如果您想匹配一个字面点号,请转义. 另外,{1}是多余的,请将其删除。接下来,如果您需要获取一个mmylastn字符串,请加入组, "".join(re.match(...)。groups())-请参阅https://rextester.com/UMOO62524. - Wiktor Stribiżew
我认为你可以简单地实现它,甚至不需要使用正则表达式。firstName, lastName = email.split('@')[0].replace('-','').split('.') print(firstName[0] + lastName[0:7]) - Krishna Chaurasia
@WiktorStribiżew 哇,你太棒了!感谢你的重新激活,现在它可以正常工作了 ;) - Will
我发布了带有注释的解决方案。 - Wiktor Stribiżew
1个回答

2
首先,正则表达式中的 . 是一个元字符,可以匹配除换行符以外的任何字符。你需要在正则表达式模式中转义 .
另外,{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演示。


请问为什么{1}总是多余的?我不明白为什么(.)[a-z]+返回的是第一个字符而不是整个第一个单词。 - Will
1
@Will . = .{1} = 匹配除换行符以外的任何一个字符,匹配一次是默认行为。n 匹配单个 n,而 n{1} 则匹配一个 n 一次。这就是原因。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接