linxi2011hr 发表于 2016-10-22 07:39:36

前向否定断言功能真方便!

hehehaha4334 发表于 2016-12-28 10:56:05

感谢甲鱼,努力学习

枯叶_ 发表于 2017-1-6 04:44:46

非捕获组有什么用有没有栗子能举一下?{:9_241:}

Kiopler 发表于 2017-1-30 06:56:33

看到这里晕了{:10_266:} 坚决继续弄懂这个该死的正则表达式....我突然发现Linux里面也有关于正则表达式的{:10_266:}

Kiopler 发表于 2017-1-30 10:17:16

总体理解了,但是还有几个地方不是很清楚...表示再去查查资料 {:10_266:}

但是总体文章还是很赞的

kelydia 发表于 2017-2-14 15:48:20

感觉非捕获组没什么实际用处啊,求举例说服{:10_256:}

Santi 发表于 2017-5-31 20:11:27

最后一个向前否定断言 我机试没效果呢 ?

kent_allen 发表于 2017-12-29 11:17:41

查了其他资料,新人说下对前向断言的理解:
1.(?=...):前向肯定断言,仅当正则表达式 ... 在目标字符串的右侧匹配时才会继续匹配。例如/w(?=/d)表示与后跟数字的单词匹配,而不是与该数字匹配;
2.(?!...):前向否定断言,仅当正则表达式 ... 与目标字符串的右侧不匹配时才会继续匹配。例如/w(?!/d)表示与后不跟数字的单词匹配。

况qiqi 发表于 2018-4-3 16:21:43

似乎有一点懂非捕获组的意思le
>>> searchVsFindallStr = """
pic url test 1 http://1821.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae35f9d5g213.jpg
pic url test 2 http://1881.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae35ee46g213.jpg
pic url test 2 http://1802.img.pp.sohu.com.cn/images/blog/2012/3/7/23/28/u121516081_136ae361ac6g213.jpg
"""
>>> 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$']

小牙子 发表于 2018-6-14 16:22:35

学习一波

tanteshenma 发表于 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)#为什么这样是正确的?

lidongze6 发表于 2018-11-26 16:09:04

>>> m = re.match("()+", "abc")
>>> m.groups()
('c',)
为什么会得到“c”?不是太明白

MrClown 发表于 2019-3-1 15:13:32

lidongze6 发表于 2018-11-26 16:09
>>> m = re.match("()+", "abc")
>>> m.groups()
('c',)


因为group()和groups()是两个函数
m.groups()相当于(m.group(1),m.group(2),.......)以元组的形式返回
此题因为只有一个组
所以m.groups()相当于(m.group(1),) 因为没有m.group(2)

MrClown 发表于 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()函数有子组的话(子组为捕获组)只返回子组里面匹配的内容,而当为子组为非捕获组时候返回整体

红tea少年 发表于 2019-5-14 09:55:10

huatiy

刘大大的水果糖 发表于 2019-6-7 19:59:31

>>> m = re.match("()+", "abc")
>>> m.groups()
('c',)

这个地方有些不明白,为什么匹配到的只有“c”?按理说中括号「」里的a,b,c都匹配到了啊

品如的衣服 发表于 2019-6-20 15:34:43

MrClown 发表于 2019-3-1 15:13
因为group()和groups()是两个函数
m.groups()相当于(m.group(1),m.group(2),.......)以元组的形式返回
...

人家在问为什么没有匹配到a和b

kingjoydondo 发表于 2019-8-3 00:13:26

如下为什么子组只匹配了最后一个 'c'?还有‘’a’、‘b’、‘ab’、‘bc’呢?

>>> m = re.match("()+", "abc")
>>> m.groups()
('c',)

憨豆先生 发表于 2019-8-16 18:34:10

有点看的不太明白。

踏歌行天路 发表于 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)
页: 1 [2] 3
查看完整版本: Python3 如何优雅地使用正则表达式(详解五)