鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[扩展阅读] Python3 如何优雅地使用正则表达式(详解五)

  [复制链接]
发表于 2016-10-22 07:39:36 | 显示全部楼层
前向否定断言功能真方便!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-28 10:56:05 | 显示全部楼层
感谢甲鱼,努力学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-6 04:44:46 | 显示全部楼层
非捕获组有什么用有没有栗子能举一下?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-30 06:56:33 | 显示全部楼层
看到这里晕了 坚决继续弄懂这个该死的正则表达式....我突然发现Linux里面也有关于正则表达式的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-30 10:17:16 | 显示全部楼层
总体理解了,但是还有几个地方不是很清楚...表示再去查查资料

但是总体文章还是很赞的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-14 15:48:20 | 显示全部楼层
感觉非捕获组没什么实际用处啊,求举例说服
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-31 20:11:27 | 显示全部楼层
最后一个向前否定断言 我机试没效果呢 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-29 11:17:41 | 显示全部楼层
查了其他资料,新人说下对前向断言的理解:
1.(?=...):前向肯定断言,仅当正则表达式 ... 在目标字符串的右侧匹配时才会继续匹配。例如/w(?=/d)表示与后跟数字的单词匹配,而不是与该数字匹配;
2.(?!...):前向否定断言,仅当正则表达式 ... 与目标字符串的右侧不匹配时才会继续匹配。例如/w(?!/d)表示与后不跟数字的单词匹配。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-4-3 16:21:43 | 显示全部楼层
似乎有一点懂非捕获组的意思le
>>> searchVsFindallStr = """
pic url test 1 http://1821.img.pp.sohu.com.cn/i ... 136ae35f9d5g213.jpg[/img]
pic url test 2 http://1881.img.pp.sohu.com.cn/i ... 136ae35ee46g213.jpg[/img]
pic url test 2 http://1802.img.pp.sohu.com.cn/i ... 136ae361ac6g213.jpg[/img]
"""
>>> singlep_nogroup='http://\w+\.\w+\.\w+.+?/\w+?.jpg'
>>>  re.findall(singlep_nogroup, searchVsFindallStr)
['http://1821.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae35f9d5g213.jpg', 'http://1881.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae35ee46g213.jpg', 'http://1802.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae361ac6g213.jpg']

>>> singlep_nogroup='http://\w+.+?/\w+?.jpg'
>>> re.findall(singlep_nogroup, searchVsFindallStr)
['http://1821.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae35f9d5g213.jpg', 'http://1881.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae35ee46g213.jpg', 'http://1802.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae361ac6g213.jpg']
>>> singlep_noncapture='http://(?:\w+)\.(?:\w+)\.(?:\w+).+?/(?:\w+?).jpg'
#全都是非捕获组,则全都会返回,,返回的吗、内容不是包含子组内容的元组

>>> re.findall(singlep_noncapture, searchVsFindallStr)
['http://1821.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae35f9d5g213.jpg', 'http://1881.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae35ee46g213.jpg', 'http://1802.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae361ac6g213.jpg']
>>> singlep_noncapture='http://(\w+)\.(?:\w+)\.(?:\w+).+?/(?:\w+?).jpg'
#有一个是捕获组,则结果只返回捕获组的内容

>>> singlep_group='(http://)(\w+\.)(\w+\.)(\w+)(.+?/)(\w+?.)jpg'
>>> re.findall(singlep_group, searchVsFindallStr)
[('http://', '1821.', 'img.', 'pp', '.sohu.com.cn/images/blog/2012/3/7/23/28/', 'u121516081_136ae35f9d5g213.'), ('http://', '1881.', 'img.', 'pp', '.sohu.com.cn/images/blog/2012/3/7/23/28/', 'u121516081_136ae35ee46g213.'), ('http://', '1802.', 'img.', 'pp', '.sohu.com.cn/images/blog/2012/3/7/23/28/', 'u121516081_136ae361ac6g213.')]
#有子组,则返回的是元组

>>> re.findall(singlep_noncapture, searchVsFindallStr)
['1821', '1881', '1802']

>>> p=re.findall(r'(\d+)(?:\.?)(?:\d+)([$¥])$','1000.56$')
>>> p
[('1000', '$')]
>>> p=re.findall(r'(?:\d+)\.(?:\d+)([$¥])$','1000.56$')
>>> p
['$']
>>> p=re.findall(r'(?:\d+)\.(?:\d+)(?:[$¥])$','1000.56$')
>>> p
['1000.56$']

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-14 16:22:35 | 显示全部楼层
学习一波
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-18 22:16:34 | 显示全部楼层
#要匹配出cca或者ccb
m = re.compile("cc(a|b)")
k=m.findall("abbaccabbba")
print(k)  #为什么这样匹配是错误的
m = re.compile("cc(?:a|b)")
k=m.findall("abbaccabbbaccb")
print(k)  #为什么这样是正确的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-26 16:09:04 | 显示全部楼层
>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
为什么会得到“c”?不是太明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-1 15:13:32 | 显示全部楼层
lidongze6 发表于 2018-11-26 16:09
>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)

因为group()和groups()是两个函数
m.groups()相当于(m.group(1),m.group(2),.......)以元组的形式返回
此题因为只有一个组
所以m.groups()相当于(m.group(1),) 因为没有m.group(2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-2 12:01:42 | 显示全部楼层
tanteshenma 发表于 2018-9-18 22:16
#要匹配出cca或者ccb
m = re.compile("cc(a|b)")
k=m.findall("abbaccabbba")

findall()函数有子组的话(子组为捕获组)只返回子组里面匹配的内容,而当为子组为非捕获组时候返回整体
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-5-14 09:55:10 | 显示全部楼层
huatiy
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-7 19:59:31 | 显示全部楼层
>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)

这个地方有些不明白,为什么匹配到的只有“c”?按理说中括号「」里的a,b,c都匹配到了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-20 15:34:43 | 显示全部楼层
MrClown 发表于 2019-3-1 15:13
因为group()和groups()是两个函数
m.groups()相当于(m.group(1),m.group(2),.......)以元组的形式返回
...

人家在问为什么没有匹配到a和b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-3 00:13:26 | 显示全部楼层
如下为什么子组只匹配了最后一个 'c'?还有‘’a’、‘b’、‘ab’、‘bc’呢?

>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-16 18:34:10 | 显示全部楼层
有点看的不太明白。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-1 21:22:46 | 显示全部楼层
小甲鱼断言部分写的不对哈
以下真实测试
import re
s = 'foo.bar,foo.bat,foo.cf,foo.exe,foo.batch'
m = re.compile('\w+[.](?!bat\W)\w+')
m.findall(s)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 19:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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