正则表达式匹配ip地址问题
请问为什么上面一句可以成功匹配而下面一句和小甲鱼在视频中一模一样的却匹配不了呢r'\d+\.\d+\.\d+\.\d+'
r"((25|2\d|{0,1}\d{0,1}\d)\.){3}(25|2\d|{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|2\d|{0,1}\d{0,1}\d)\.){3}(25|2\d|{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|2\d|{0,1}\d{0,1}\d)\.){3}(?:25|2\d|{0,1}\d{0,1}\d))"
在括号内加上 ?:这样该组就变成了非捕获组,即会将小括号内的进行匹配,但是不会仅仅捕获小括号内的部分。
看看这个帖子:Python3 如何优雅地使用正则表达式(详解五)
页:
[1]