python - python 正则表达式返回非捕获组
问题描述
我想从一封电子邮件中生成一个用户名:
- 名字的第一个字母
- 姓氏的前 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('-','')
摆脱-
符号- 捕获我上面描述的 2 个组的正则表达式
如果我这样做,.group(1,2)
我可以看到捕获的组是m
and mylastn
,所以一切都很好。但是 using.group()
不仅返回捕获组,还返回它们之间的所有内容:myfirstnamemlastn
有人可以向我解释这种行为吗?
解决方案
首先,.
模式中的 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 演示。
推荐阅读
- makefile - make:指定包依赖位置
- javascript - history.push('/somePath') 不工作,被异步函数弄糊涂了
- .net - .NET - Microsoft.Web.WebView2 是开源的吗?
- flutter - 在更新我的应用程序时,您的 Android App Bundle 使用错误的密钥签名错误
- c# - 在 Azure Modile 应用服务后端将字符串属性反序列化为 Json 对象
- java - 构造函数 Peca() 未定义
- java - 为什么这个 Spring Boot 应用程序会为发布请求引发异常
- python - Selenium:等待元素加载
- html - 使用 iframe 计算 CSS
- reactjs - 如何使用钩子将变量分派到 redux 文件