鱼C论坛

 找回密码
 立即注册
查看: 1271|回复: 1

[已解决]正则表达式匹配ip地址问题

[复制链接]
发表于 2020-7-23 19:46:47 | 显示全部楼层 |阅读模式

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

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

x
请问为什么上面一句可以成功匹配而下面一句和小甲鱼在视频中一模一样的却匹配不了呢
r'\d+\.\d+\.\d+\.\d+'  
r"((25[0-5]|2[0-4]\d|[01]{0,1}\d{0,1}\d)\.){3}(25[0-5]|2[0-4]\d|[0-1]{0,1}\d{0,1}\d)"

全部代码如下:
import urllib.request
import re


def url_open(url):
    req = urllib.request.Request(url)
    req.add_header('User-Agent',
                   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36')
    req.add_header("Referer", url)
    req.add_header('Cookie',
                   'channelid=0; sid=1595497917869719; _ga=GA1.2.1332145757.1595494283; _gid=GA1.2.1320792781.1595494283; Hm_lvt_7ed65b1cc4b810e9fd37959c9bb51b31=1595494285; Hm_lpvt_7ed65b1cc4b810e9fd37959c9bb51b31=1595499586')
    req.add_header('Host', 'www.kuaidaili.com')
    response = urllib.request.urlopen(req)
    html = response.read()
    html = html.decode("utf-8", "ignore")
    return html


def main(pages=10, filename='IP'):
    ips = []
    url = "https://www.kuaidaili.com/free/intr/"
    pattern = r'\d+\.\d+\.\d+\.\d+'  # r"((25[0-5]|2[0-4]\d|[01]{0,1}\d{0,1}\d)\.){3}(25[0-5]|2[0-4]\d|[0-1]{0,1}\d{0,1}\d)"

    for each in range(pages):
        each += 1
        site = url + str(each) + '/'
        html = url_open(site)
        all_ip = re.findall(pattern, html)
        for i in all_ip:
            if i != '':
                ips.append(i)
            print(i)


main()
最佳答案
2020-7-23 20:46:12
估计你还没有看完吧?
这是小括号分组引入的问题,默认都是捕获组,即每个小括号内的部分都会被识别,检测到就会被提取出来。
但是实际上,我们需要的是整个IP,而不是将IP分成若干段。
所以需要有捕获组和非捕获组。
pattern = r"((?:(?:25[0-5]|2[0-4]\d|[01]{0,1}\d{0,1}\d)\.){3}(?:25[0-5]|2[0-4]\d|[0-1]{0,1}\d{0,1}\d))"
在括号内加上   ?:  这样该组就变成了非捕获组,即会将小括号内的进行匹配,但是不会仅仅捕获小括号内的部分。
看看这个帖子:Python3 如何优雅地使用正则表达式(详解五)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-23 20:46:12 | 显示全部楼层    本楼为最佳答案   
估计你还没有看完吧?
这是小括号分组引入的问题,默认都是捕获组,即每个小括号内的部分都会被识别,检测到就会被提取出来。
但是实际上,我们需要的是整个IP,而不是将IP分成若干段。
所以需要有捕获组和非捕获组。
pattern = r"((?:(?:25[0-5]|2[0-4]\d|[01]{0,1}\d{0,1}\d)\.){3}(?:25[0-5]|2[0-4]\d|[0-1]{0,1}\d{0,1}\d))"
在括号内加上   ?:  这样该组就变成了非捕获组,即会将小括号内的进行匹配,但是不会仅仅捕获小括号内的部分。
看看这个帖子:Python3 如何优雅地使用正则表达式(详解五)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 20:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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