鱼C论坛

 找回密码
 立即注册
查看: 910|回复: 9

一个正则表达式的疑问

[复制链接]
发表于 2018-11-20 14:25:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近看了一些关于正则表达式的内容,自己想写一个正则表达式,但出问题了。请各位给把把关。
源码:
#!python3
#搜索文字中包含多少电子邮件的一个正则表达式
import re
regex1=re.compile(r'\w+@\w+(\.com)?(\.cn)?(\.net)?')#?表示查找0次或1次
result1=regex1.findall('zhangsan@abc.com.cn, ruoka@qq.com, ruoka@163.net')
print(result1)
那么,问题来了,我print的结果是[('.com', '.cn', ''), ('.com', '', ''), ('', '', '.net')],根本就没有电子邮件的前面的特征啊。是啥原因啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-11-20 17:11:55 | 显示全部楼层
  1. import re
  2. regex1=re.compile(r'\w+@\w+(?:\.com)?(?:\.cn)?(?:\.net)?')#?表示查找0次或1次
  3. result1=regex1.findall('zhangsan@abc.com.cn, ruoka@qq.com, ruoka@163.net')
  4. print(result1)
复制代码

要解除子组捕获
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-20 17:37:32 | 显示全部楼层
本帖最后由 影响思维 于 2018-11-20 17:40 编辑


加上(?:)就可以了?
同时请问,为什么原代码在:
result1=regex1.search('zhangsan@abc.com.cn, ruoka@qq.com, ruoka@163.net')
result.group()
中是可以的?不用解除子组捕获了?但这个search方法只能找到第一个邮箱。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 18:44:27 | 显示全部楼层
findall()方法就是匹配子组中的内容,除非设置了?:这个非捕获组
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 18:53:52 | 显示全部楼层
小甲鱼的正则表达式课程你一定没认真听
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 18:55:20 | 显示全部楼层
影响思维 发表于 2018-11-20 17:37
加上(?:)就可以了?
同时请问,为什么原代码在:
result1=regex1.search('zhangsan@abc.com.cn, , ') ...

search本来就是找到一个就返回的,找多个用findall
因为你括号括起来findall按子组匹配,
所以要加?:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 20:52:42 | 显示全部楼层
help(re.findall)
Help on function findall in module re:

findall(pattern, string, flags=0)
    Return a list of all non-overlapping matches in the string.
   
    If one or more capturing groups are present in the pattern, return
    a list of groups; this will be a list of tuples if the pattern
    has more than one group.
   
    Empty matches are included in the result.

这是findall的帮助文档,大概意思说:
如果你的正则表达式有分组,就返回分组的表达式式匹配结果到一个元组中。
所以你如果要得到完整的邮件地址也可以把整个表达式搞成一组,或者就把分组弄成非捕获组。
regex1=re.compile(r'(\w+@\w+(\.com)?(\.cn)?(\.net)?)')或者
regex1=re.compile(r'\w+@\w+(?:\.com)?(?:\.cn)?(?:\.net)?')
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 21:04:02 | 显示全部楼层
.com,.net是一个级别的,不会同时出现,所以建议改成这样
pat=re.compile(r'(\w+@\w+(?:\.com|\.net)?(?:\.cn)?)')
r=pat.findall('zhangsan@abc.com.cn, ruoka@qq.com, ruoka@163.net')
print(r)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 10:32:43 | 显示全部楼层
TCY 发表于 2018-11-20 18:53
小甲鱼的正则表达式课程你一定没认真听

我还真没听这个课。我是通过其它资料来自已看的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 10:35:32 | 显示全部楼层
喜欢吃菠菜 发表于 2018-11-20 21:04
.com,.net是一个级别的,不会同时出现,所以建议改成这样
pat=re.compile(r'(\w+@\w+(?:\.com|\.net)?(?:\ ...

似乎明白了一些了。感谢各位大佬。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-8 20:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表