findall数字问题

findall数字问题

p1=re.findall('(\d{1,3}\.){3}\d{1,3}','192.168.0.1')

print(p1)

为什么输出是['0.']??

而不是所有的东西



正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手乔木 2020-03-05 12:09:42

同学你好:

findall源码:

def findall(pattern, string, flags=0):
“”“Return a list of all non-overlapping matches in the string.
返回字符串中所有非重叠匹配的列表。
如果模式中存在一个或多个捕获组,则返回组列表; 如果模式有多个组,这将是一个元组列表。
结果中包含空匹配。”""
return _compile(pattern, flags).findall(string)

(\d{1,3}\.){3}只会输出符合组内容的第3个。

http://img1.sycdn.imooc.com//climg/5e607b7409a03be509240243.jpg

需要非捕获组:

捕获组和非捕获组,指的就是分组。

捕获组就是一般的分组,如果正则表达式中存在分组,则findall只会对分组中的正则进行匹配,如果只有一个分组,则返回列表,如果有多个分组,则返回为列表嵌套元祖的形式。形如:(\d+)

将捕获组转化为非捕获组只需在捕获组前加上“?:”,形如:(?:\d+)

http://img1.sycdn.imooc.com//climg/5e607b5b09bc646408850248.jpg

如果我解决了同学的问题,请采纳!学习愉快^_^。



  • 提问者 马化腾是我儿 #1
    看了一会才完全理解,原来如此
    2020-03-05 15:12:27
  • 玖__ #2
    老师,没看懂啊,为什么(\d{1,3}\.){3}只会输出符合组内容的第3个。 而使用非捕获组的结果就是我这个 p1=re.findall('(\d{1,3}\.){3}\d{1,3}','192.168.0.1') 我以为我想要的结果,而非不是,得用非捕获组
    2020-03-06 10:27:11
  • 同学你好:这个findall官方文档的解释的匹配的原则就是这样,同学需要做的就是将捕获组变为非捕获组。同学可以自己去了解官方文档的信息,学习愉快^_^。
    2020-03-06 19:29:18
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师