| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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() 
估计你还没有看完吧? 
这是小括号分组引入的问题,默认都是捕获组,即每个小括号内的部分都会被识别,检测到就会被提取出来。 
但是实际上,我们需要的是整个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 如何优雅地使用正则表达式(详解五) 
 
 
 |   
 
 
 
 |