目录
五,Python logging 模块之 logging.basicConfig 用法和参数详解
2 logging.basicConfig(**kwargs)
4 爬取壁纸实例(自己编写的实例,暴力的正则匹配,main函数测试的时候使用break)
一、urllib
1、request简介
request是最基本的HTTP请求模块,可以模拟请求的发送,其过程与在浏览器中输入网址1然后回车一样,只要给库方法传入URL以及额外的参数,就可以模拟实现发送请求的过程。
1.1 urlopen
rullib.request模块可以模拟浏览器的请求发起过程,同时还具备处理授权验证(authentication)、重定向(redirection)、浏览器Cookie等功能。
基本写法如下:
import urllib.request
response = urllib.request.urlopen("https://www.python.org/")
print(response.read().decode('utf-8'))
该方法为GET请求方法。使用type方法得到响应的类型:
print(type(response))
输出:<class 'http.client.HTTPResponse'>
所以响应是一个HTTPResponse类型的对象。
使用方法输出响应的状态码和响应的头信息:
print(response.status) #得到响应的状态码
print(response.getheaders()) #得到响应的响应头信息
print(response.getheader("Server")) #获取响应头的键为Server的值
urlopen的API用法:
response = urllib.request.Request(url, data = None, [timeout]*,cafile = None,capath = None,cadefault = False,context = None)
1.2 data参数设计
data参数是可选的,在添加该参数时,需要使用bytes方法将参数转化为字节流编码格式的内容,即bytes类型。如果传递了data参数,则请求方方式为GET,而不是POST了。
实例:
import urllib.request
import urllib.parse
data = bytes(urllib.parse.urlencode({'name':'germey'}), encoding = 'utf-8')
response = urllib.request.urlopen('https://www.httpbin.org/post', data = data)
print(response.read().decode('utf-8'))
得到结果:
{ "args": {}, "data": "", "files": {}, "form": { "name": "germey" }, "headers": { "Accept-Encoding": "identity", "Content-Length": "11", "Content-Type": "application/x-www-form-urlencoded", "Host": "www.httpbin.org", "User-Agent": "Python-urllib/3.11", "X-Amzn-Trace-Id": "Root=1-64997bdd-011711375cc64ba54dba4056" }, "json": null, "origin": "1.202.187.118", "url": "https://www.httpbin.org/post" }
则在data中设置的参数传递到form字段中,说明是模拟表达提交,即为POST方式传输数据。
1.3 timeout参数
timeout参数用于设置超时时间,单位为秒,意思是如果请求超过了这只的这个时间,但是还没有得到响应,就会抛出异常。如果不指定该参数,则会使用全局默认时间。timeout参数支持HTTP,HTTPS,FTP请求。
import socket
import urllib.request
import urllib.parse
import urllib.error
try:
response = urllib.request.urlopen('https://www.httpbin.org/post', timeout=0.1)
except urllib.error.URLError as e:
if isinstance(e.reason, socket.timeout):
print("timeout")
输出timeout。
1.4 Request方法
urlopen可以发起最基本的请求,但是他的参数并不足以构建一个完整的请求。当需要往请求中加入Headers等信息时,就需要利用更加强大的Request类来构建请求。
例如:
import urllib.request
request = urllib.request.Request('https://www.mysql.com/cn/')
respence = urllib.request.urlopen(request)
print(respence.read().decode('utf-8'))
Request类的标准方法为:
class urllib.request.Request(url, data = None, headers = {}, origin_reg_host = None, unverifiable = False, method = None)
url:用于请求的URL,这是必传参数,其他为可选参数。
data:必须传递bytes参数,如果是字典,则可以使用urllib.parse中的urlencode方法进行编码
headers :传递一个字典,可以使用headers参数直接构造,也可以使用add_header方法添加。
origin_req_host:指的是请求方的host名称或者IP地址。
unverigiable:表示请求是否无法验证,默认值为False,意思为用户没有足够的权限来接受这个请求的结果。
method:这是一个字符串,表示用来请求使用的方法,例如GET,POST和PUT。
1.5 高级用户(Cookie、代理)
使用Handler类,Handler可以理解为各种处理器,使用Handler可以处理登录验证,处理Cookie,处理代理设置。urllib.request中有BaseHandler类,这是其他所有Handler的父类,以下几个子类可以作为基本的处理方式。
HTTPDefualtErrorHandler用于处理HTTP响应错误,所有错误都会抛出HTTPErroe类型的异常。
HTTPRedirectHandler用于处理重定向。
HTTPCookieProcessor用于处理Cookie。
ProxyHandler用于处理代理设置,代理默认为空。
HTTPPasswordMgr用于管理密码,它卫华着用户密码的对照表。
HTTPBasicAuthHandler用于管理认证,如果一个链接在打开时需要认证,那么可以用这个类来解决认证问题。
OpennerDirector类,可以作为Openor,提供open方法。
身份认证:
from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener
from urllib.error import URLError
username = 'admin'
password = 'admin'
url = 'https://ssr3.scrape.center/'
p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None, url,username, password)
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)
try:
restult = opener.open(url)
html = restult.read().decode('utf-8')
print(html)
except URLError as e:
print(e.reason)
代理:
from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
proxy_handler = ProxyHandler({
'http': 'http:/127.0.0.1:8080',
'https': 'https://127.0.0.1:8080'
})
opener = build_opener(proxy_handler)
try:
response = opener.open('https://www.baidu.com/')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
Cookie:
import http.cookiejar, urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
reponse = opener.open('https://www.baidu.com')
for item in cookie:
print(item.name + "=" + item.value)
将Cookie输出转化为文件格式,将CookieJar改为CookieJar的 子类MozillaCookieJar即可。
import urllib.request, http.cookiejar
filename = 'cookie.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)
使用子类LWPCookieJar同样可以保存Cookie,保存格式为LWP(libwww-perl)格式
import urllib.request, http.cookiejar
cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookie.txt',ignore_expires=True, ignore_discard=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
opener = opener.open('https://www.baidu.com')
print(opener.read().decode('utf-8'))
2、urllib——error模块
2.1 URLerror模块
URLerror类来自urllib库的error模块,继承自OSError类,是error异常模块的基类。其中的reason属性,返回错误的原因,例如:
from urllib import request,error
try:
reponse = request.urlopen('https://cuiqingcai.com/404')
except error.URLError as e:
print(e.reason)
2.2 HTTPError
HTTPError是URLError的子类,专门处理HTTP请求错误,它的属性有:
code:返回HTTP状态码,例如404表示网页不存在,500表示服务器内部错误。
reason:与URLerror一样,用于返回错误的原因
headers:返回请求头
例如:
from urllib import request,error
try:
reponse = request.urlopen('https://cuiqingcai.com/404')
except error.HTTPError as e:
print(e.code, e.reason,e.headers, sep='\n')
3、urllib——parse模块
urllib.parse模块定义了处理URL的标准接口,例如实现URL各部分的抽取,合并以及连接转化。它支持协议的URL处理: file,ftp,ogpher,hdl,http,https,imap,mailto,mms,news,nntp,prospero,rsync,rtsp,rtspu,sftp,sip,sips,snews,svn,svn+ssh,telnet和wais。
3.1 urlparse方法
urlparse可以实现RUL的识别和分段,例如:
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(result)
结果:
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
urlparse有三个参数:
1、urlstring:这是必选参数,即待解析的URL。
2、scheme:这是默认的协议,例如https或者http,如果URL没有带有协议,则将这个协议作为默认的协议。
3、allow_fragments:是否忽略fragment,如果False,则fragments则会被忽略,会被解析为path、params或者query的一部分,而fragment则为空。
3.2 urlunparse方法
urlunparse用于构造URL,例如:
import urllib.parse data = ['https','www.baidu.com','index.html','user','a=6','comment'] print(urllib.parse.urlunparse(data))
得到:百度一下,你就知道;user?a=6#comment
3.3 urlsplit方法
urlsplit与urlparse一样,都是用于解析URL,但是不再单独解析params这一部分,而是将params合并到path中,只返回5个结果。
3.4 urlunsplit方法
与urlunparse方法类似,将URL的各个部分组合为完成的链接。
3.5 urlencode方法
常常在构造GET请求参数时用到,参数为字典,可以将params序列转化为GET请求的URL的参数。
3.6 parse_qs方法
将一串GET请求参数转回字典。
3.7 parse_qsl方法
将参数转化为由元组组成的列表。
3.8 quote方法
将内容转化为URL编码的格式,用于当URL中有中文时,可能导致乱码的情况,则将中文部分转化为URL编码格式。
3.9 unquote方法
对URL的编码进行解码。
3.10 urljion
from urllib.parse import urljoin
help(urljoin)
Help on function urljoin in module urllib.parse:
urljoin(base, url, allow_fragments=True)
Join a base URL and a possibly relative URL to form an absolute
interpretation of the latter.
urljoin()是连接一个基本URL和一个可能的相对URL来形成一个绝对URL
。那么,客观来说,base参数所代表的就是基本URL,url代表相对URL,最后的allow_fragments基本上不常用,它是是否忽略锚点的意思
4、urllib——robotparser模块
4.1 Robots协议
Robots Exclusion Protocol(网络爬虫排除标准),即Robots协议,也称为爬虫协议,机器人协议。用来告诉爬虫或者搜索引擎哪些网页可以抓取,哪些网页不可以抓取,通常是在一个叫做robots.txt的文本文件,一帮放在网站的根目录下。
4.2 爬虫名称
爬虫有固定的名称,例如:
BaiduSpider——百度
Googlebot——谷歌
360Spider——360搜索
YodaoBot——有道
ia_archiver——Alexa
Scooter——altavista
Bingbot——必应
4.3 robotparser
robotparser模块可以解析robots.txt文件,该模块提供了一个RobotFileParser类,可以根据某个网站的robots.txt文件判断一个爬取爬虫是否有权限爬取这个网页。使用这个类,只需要在构造方法里传入robots.txt文件的链接即可:
urllib.robotparser.RobotFileParser(url=""),也可以使用set_url()方法添加连接。
下列方法为RobotFileParser类的几个常用方法:
1、set_url:用来设置robots.txt文件的链接。
2、read:读取robots.txt文件并进行分析,这个方法执行读取和分析操作,如果不调用这个方法,接下来的判断都会为False。
3、parse:用来解析robots.txt文件,传入的参数是robots.txt文件中的某些行的内容,会按照robots.txt的语法规则来分析这些内容。
4、can_fetch:该方法有两个参数,第一个User_Agent,第二个是要抓取的URL,返回的结果是True或者False,表示User_Agent是否可以抓取URL。
5、mtime:返回上次抓取和分析robots.txt文件的时间,用于长时间分析和抓取robots.txt文件,定期检查以抓取最新的robots.txt文件
6、modified:可以将当前时间这是为上次抓取和分析robots.txt文件的时间。
二、 requests
1 request请求介绍
requests中的get(),post(),put(),delete(),patch()方法可以实现GET,POST,PUT,DELETE,PATCH请求。
2 GET请求
例如:
import requests
re = requests.get('https://www.httpbin.org/get')
print(re.text)
data = {
'name': "germy",
'age': "25"
}
re = requests.get(url='https://www.httpbin.org/get', params=data)
print(re.text)
可以使用params传递参数,返回结果为一个JSON格式的数据。
3、抓取网页信息
使用正则表达式抓取网页信息,例如:
import requests
import re
r = requests.get(url='https://ssr1.scrape.center/')
pattern = re.compile('<h2.*?>(.*?)</h2>', re.S)
titles = re.findall(pattern,r.text)
print(titles)
返回的是一个HTML文档:
['霸王别姬 - Farewell My Concubine', '这个杀手不太冷 - Léon', '肖申克的救赎 - The Shawshank Redemption', '泰坦尼克号 - Titanic', '罗马假日 - Roman Holiday', '唐伯虎点秋香 - Flirting Scholar', '乱世佳人 - Gone with the Wind', '喜剧之王 - The King of Comedy', '楚门的世界 - The Truman Show', '狮子王 - The Lion King']
4、抓取二进制数据
网页中,图片、音频、视频这些文件本质上都是由二进制码组成,但是由于有特定的保存格式和对应的解析方式,所以要抓取它们,就必须拿到它们的二进制数据。
以抓取图标为例:
import requests
response = requests.get(url='https://scrape.center/favicon.ico')
print(response.text)
print(response.content)
text在打印时是直接转化为str类型,而content则会输出bytes类型数据,可以将content以二进制的方式写入文件,即可看见爬取的图标:
import requests
response = requests.get(url='https://scrape.center/favicon.ico')
#print(response.text)
#print(response.content)
with open('favicon.ico', 'wb') as f:
f.write(response.content)
得到图片为:
5、添加请求头
请求头以字典的方式添加,直接放在get方法中的headers参数:
import requests
headers = {
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.58"
}
reponse = requests.get(url='https://gw.alicdn.com/imgextra/i3/O1CN01uRz3de23mzWofmPYX_!!6000000007299-2-tps-143-59.png',
headers=headers)
print(reponse.text)
with open('picture1.png','wb') as f:
f.write(reponse.content)
6 POST请求
将GET换位POST,即可完成POST请求:
import requests
data = {
'name': 'germey',
'age' : '25'
}
response = requests.post(url='https://www.httpbin.org/post', data=data)
print(response.text)
7 响应
使用方法得到响应的状态码,响应头,Cookie等:
import requests
response = requests.get(url='https://ssr1.scrape.center/')
print(type(response.status_code), response.status_code)
print(type(response.headers),response.headers)
print(type(response.cookies),response.cookies)
print(type(response.url),response.url)
print(type(response.history),response.history)
history得到请求历史。
8 上传文件
requests.post中的file参数可用于上传文件:
import requests
files = {'file': open('favicon.ico','rb')}
response = requests.post(url='https://www.httpbin.org/post', files=files)
print(response.text)
9 Cookie设置
使用cookies属性直接获取cookie:
import requests
response = requests.get(url='https://www.baidu.com')
print(response.cookies)
for key, value in response.cookies.items():
print(key + '=' + value)
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]> BDORZ=27315
可以看出,Cookie是一个RequestsCookieJar类型的数据。
访问GitHub:
import requests headers = { 'Cookie' : '_octo=GH1.1.1952410655.1687965630; _device_id=7abb2eed2a3bc9c7ccdd9c50dc72c733; preferred_color_mode=light; tz=Asia%2FShanghai; has_recent_activity=1; user_session=2AuvTS3iXnnwjKJhxdv8P51QcoDaV3BfEdDWvBfqaDRQdSTy; __Host-user_session_same_site=2AuvTS3iXnnwjKJhxdv8P51QcoDaV3BfEdDWvBfqaDRQdSTy; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=LOVELONGZHICHENG; _gh_sess=58%2Fhf7MZ4nt7Bb9y4U0OZLhFH5psxb%2ByZuvBogQL3VcDnRcvuIqh4E8rWByk15hH1M%2FoigRknRX5NlJd3PTGDhieA5zExfzszBAcM948IIhhmgJ5W%2FbYd5Z64lpkkXoPsbku%2Bk7s0UPXnyBWyM1hzDEnI2g8LiZLXrQvzPdU03QK2z5slTut9SQfNUywdd6vlZ9yHH8jHfKvBZ4wQcA9wBFKKWvxEh1IPwa%2F7sMByaESCw%2Fzy%2FR5Akt8dCRXcYVrLRD2pbXOTc%2FcSUSboB45OfuSD%2BDuj6oueKUBVuDsP8gdQwLLAlfcHoInOg3bUWrSupVz8nG6H0DVwkp7OoAlmpUGCDiNRPlwXCIDknEenvKSjEL1HeSoxFh3UI2sSwKWs9J8IatjB2atqes3QNQiPL85FJypNNiDrXrOKOP8RHJa90gATMSRpLTJNocTE62kekCgTlcc%2BOmmSPAmuv4d8Q2wu2FpxBlMAtBN2%2B67u%2F6Makr6C3p3MvLcfy0n4jyfEWrex5Fq%2BMmpNekYPOftuFcbXcxbOJ6ZHDKWVhb7eCdkfNcma8m9H8Cz9qFSZ6pQxJb7cdTAzLdK1xR4Ge6r%2FRN1MwV2sRdjzdk2whwUEAPWOYL1XPHylNm5qSBKMZgx5AwUre8%2FTTjnpr06XLHPg0ebthcQyMeM0z3u9p7GIjYWzeD9k3d8%2B%2Fpoq7sz714yMpE23cjjC9ddN8ZCzti81KvPX9sb0OPxc2bDad8uieFVP5xS6dRuydyp9BWzhykL%2FxCMATXkrgGP6yk4FsXFQ0WqUWaqBeqnd%2Bwqvm6RMcPdOC4lo25XvCe42ClugKpqeLSJy5Jjar9mWaMl%2BIpTMHMqyCqPn%2FfQQ1Jwr%2FG%2FZCeZKsFYChusB8i9Jvj7QWXDn%2FVkg4HO%2B8XuASqK5juz5YemXGan8xaT6ZqTuk6eS7Zs--ii24y6hhQk9QCx7J--hdykK82UD%2F0I6uCBWqWE4Q%3D%3D', 'Connection': 'close' } response = requests.get(url='https://github.com/',headers=headers) print(response.text) print(response.cookies) for key, value in response.cookies.items(): print(key + '=' + value)
'Connection': 'close'为不使用持久连接。
10 session维持
使用POST和GET请求相当于使用两个浏览器打开了两个不同的页面,但是当我们需要打开同一个页面时,要么设置同一个Cookie,但是这样做过于繁琐。为了解决这一问题,只需维护同一个session即可,也就是第二次访问时打开新的浏览器选项卡不是打开新的浏览器,使用Session对象,就可以不用重新设置Cookie,具体如下:
首先先请求一个网站,设置一个Cookie,然后再次请求:
import requests
requests.get(url = 'https://www.httpbin.org/cookies/set/number/123456789') #设置Cookie
response = requests.get(url='https://www.httpbin.org/cookies')
print(response.text)
发现不能获取Cookie。
而当使用Session对象:
import requests
s = requests.Session()
s.get(url = 'https://www.httpbin.org/cookies/set/number/123456789') #设置Cookie number #123456789
response = s.get(url='https://www.httpbin.org/cookies')
print(response.text)
即可获得相应设置的Cookie信息
11 SSL证书认证——verify参数
现在的网站大多要求使用HTTPS协议,但是有网站可能并没有设置好HTTPS证书,或者网站的HTTPS证书可能并不被CA机构认可,这时这些网站就可能出现SSL证书错误的提示。如果直接访问这些网站 ,那么可能会出现“您的连接并不是私密连接”的错误提醒,则需要再浏览器中通过一些设置来忽略证书的验证。可以使用verify参数来控制是否验证证书,如果设置为False,那么在请求时就不会再验证证书是否有效;如果设置为True,则会自动进行验证。
例如:
import requests response = requests.get(url='https://ssr2.scrape.center/') print(response.status_code)
抛出self signed certificate (_ssl.c:992)')))——SSLError错误
则在请求时设置不用证书认证:
import requests response = requests.get(url='https://ssr2.scrape.center/',verify=False) print(response.status_code)
则会跳出警告,但是输出200,表示成功请求。
若要忽略警告,则可以导入urllib3来设置忽略警告:
import requests
import urllib3
urllib3.disable_warnings()
response = requests.get(url='https://ssr2.scrape.center/',verify=False)
print(response.status_code)
这个时候就没有警告了。
也可以通过捕获警告道日志的方式忽略警告:
import requests
import urllib3
import logging
#urllib3.disable_warnings()
logging.captureWarnings(True)
response = requests.get(url='https://ssr2.scrape.center/',verify=False)
print(response.status_code)
第三种方法可以通过get方法传入本地的证书:
import requests
import urllib3
import logging
#urllib3.disable_warnings()
logging.captureWarnings(True)
response = requests.get(url='https://ssr2.scrape.center/',cert=('/path/server.crt','/path/server.key'))
print(response.status_code)
需要有crt文件和key文件,并且key文件必须是解密状态。
12 超时设置
requests.get()中也可以设置超时时间timeout,单位为秒:
请求分为连接(connect)和读取(read)两个部分。
import requests
response = requests.get(url='https://www.httpbin.org/get', timeout=1) #设置整个请求的时间
response = requests.get(url='https://www.httpbin.org/get', timeout=(5,30))#分别设置连接connect和读取read的时间
13 身份验证
若要访问启用了身份验证的网页,则可以通过requests自带的身份验证功能,通过auth参数设置即可,用法如下:
import requests
import urllib3
from requests.auth import HTTPBasicAuth
urllib3.disable_warnings()
auth = HTTPBasicAuth('17807882078','623623ll')
response = requests.get(url='https://www.saikr.com/login', auth=HTTPBasicAuth('admin','admin'),verify=False)
print(response.status_code)
response = requests.get(url='https://www.saikr.com/login', auth=auth,verify=False)
print(response.status_code)
response = requests.get(url='https://www.saikr.com/login', auth=('账号','密码'),verify=False)
print(response.status_code)
print(response.text)
requests也可以使用其他认证方式,如OAuth认证,则需要下载oauth包:
14 代理设置——proxies
使用proxies设置代理:
import requests
proxies = {
'http': 'http://127.0.0.1:1080',
'https' : 'http://127.0.0.1:1080'
}
response = requests.get(url='https://www.jd.com/?cu=true&utm_source=baidu-search&utm_medium=cpc&utm_campaign=t_262767352_baidusearch&utm_term=304790549298_0_3ba2c5425c4f4517a9a1e54f49596db9',proxies=proxies)
print(response.status_code)
15 Prepared Request
requests在发送请求时,其实是构造了一个Request对象,赋各种参数之后然后发送出去,具体过程如下:
from requests import Request, Session
url = 'https://www.httpbin.org/post'
data = {'name': 'germey'}
headers = {
'User_Agent': ''
}
s = Session()
req = Request('POST',url=url,headers=headers,data=data)
prepped = s.prepare_request(req)
response = s.send(prepped)
print(response.text)
三、正则表达式
正则表达式是用来处理字符串的强大工具,它有自己特定的语法结构,能够实现字符串的检索,替换,匹配验证等。
1 常用正则表达式的匹配规则
可以使用在线正则表达式测试 (oschina.net)开源网页进行正则表达式匹配:
\w : 匹配字母、数字以及下划线
\W : 匹配不是字母,数字以及下划线的字符
\s : 匹配任意空白字符,等价于[\t\n\r\f]
\S : 匹配任意非空白字符
\d : 匹配任意数字,等价于[0-9]
\D : 匹配任意非数字的字符
\A : 匹配字符串开头
\Z : 匹配字符串结尾。如果存在换行,只匹配到换行前的结束字符串。
\z : 匹配字符串结尾,如果存在换行,同时还会匹配换行符
\G : 匹配最后匹配完成的位置。
\n : 匹配一个换行符。
\t : 匹配一个制表符
^ : 匹配一行字符串的开头。
$ : 匹配一行字符串的结尾。
. : 匹配任意字符,除了换行符,让re.DOTALL标记被指定时,可以匹配包括换行符的任意字符。
[...] : 用来表示一组字符,例如[amk]用来匹配a,m,k。
[^...] : 匹配不在[]中的字符,例如匹配除了a,b,c之外的字符。
* : 匹配0个或多个表达式。
+ :匹配1个或者多个表达式。
? : 匹配0个或1个前面的正则表达式定义的片段,非贪婪方式。
{n}: 精确匹配n个前面的表达式。
{n,m}: 匹配n到m次由前面正则表达式定义的片段,贪婪方式。
a|b : 匹配a或b
(): 匹配括号内的表达式,也表示是一个组。
python的re库提供了整个正则表达式的实现。