关于Re模块的一些基础知识(另附一段批量抓代理ip的代码)

1.常用匹配规则

. 表示任意字符
[0-9] 用来匹配一个指定的字符类别
[^5]表示除了5之外的其他字符,^不在字符串的开头,则表示它本身。
* 对于前一个字符重复0到无穷次
+ 对于前一个字符重复1到无穷次
?对于前一个字符重复0到1次
{m,n} 对于前一个字符重复次数在为m到n次,其中,{0,} = *,{1,} = , {0,1} = ?
{m} 对于前一个字符重复m次
| 表示"或"
python默认开启了贪婪模式的,.+?,.*?,??  #其中?表示开启非贪婪模式,也就是说只匹配一次

d 匹配任何十进制数;它相当于类 [0-9]
D 匹配任何非数字字符;它相当于类 [^0-9]
s 匹配任何空白字符;它相当于类 [ fv]
S 匹配任何非空白字符;它相当于类 [^ fv]
w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]
W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]



2.re模块常用方法

re.match(pattern, string, flags=0)   match只有当且仅当被匹配的字符串开头就能匹配

re.search(pattern, string, flags=0)   任意位置匹配,返回_sre.SRE_Match对象

re.compile(pattern, flags=0)         编译正则表达式
    prog = re.compile(pattern)
    result = prog.match(string)
    等价于
    result = re.match(pattern, string)

re.split(pattern, string, maxsplit=0) 通过正则表达式将字符串分离
    >>> re.split('W+', 'Words, words, words.')
    ['Words', 'words', 'words', '']

re.findall(pattern, string, flags=0)  找到 RE 匹配的所有子串,并把它们作为一个列表返回

re.finditer(pattern, string, flags=0)  找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。

re.sub(pattern, repl, string, count=0, flags=0) 找到 RE 匹配的所有子串,并将其用一个不同的字符串替换。

re.subn(pattern, repl, string, count=0, flags=0) 与re.sub方法作用一样,但返回的是包含新字符串和替换执行次数的两元组。

re.escape(string)对字符串中的非字母数字进行转义

re.purge() 清空缓存中的正则表达式


3.正则表达式对象
re.RegexObject
re.compile()返回RegexObject对象

re.MatchObject
group()返回被 RE 匹配的字符串
start()返回匹配开始的位置
end()返回匹配结束的位置
span()返回一个元组包含匹配 (开始,结束) 的位置

>>> import re
>>> a = re.search('a','abc')
>>> a.group()
'a'
>>> b = re.findall('b','abc')
>>> b
['b']

抓代理ip的代码区

import urllib
import urllib2
import re

def url_open(url):
	req = urllib2.Request(url)
	req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0')
	response = urllib2.urlopen(req)
	html = response.readline()
	save_ip_list = []
	while html:
		ip = re.search(r'(?:(?:[0,1]?d?d|2[0-4]d|25[0-5]).){3}(?:[0,1]?d?d|2[0-4]d|25[0-5])',html)
		if ip:
			now_ip = ip.group()
			p = re.findall(r'<td>(.+?)</td>',response.readline())
			for port in p:
				list = str(now_ip)+":"+str(port)
				print list
				save_ip_list.append(list)
				
		html = response.readline()
	return save_ip_list
	
def save_ip():
	url = "http://www.xicidaili.com/nt/2"
	save_ip_list = url_open(url)
	f = open('test.txt','w')
	for i in save_ip_list:
		f.write(i+'
')
	f.close
if __name__ == '__main__':
	save_ip()	
原文地址:https://www.cnblogs.com/Dleo/p/5509452.html