正则表达式是用来匹配一类具有相同规则的字符串。
规则:
单字符:
. :除换行以外的所有字符。
[]:[aoe] [a-w] 匹配集合中的任意一个字符
\d:数字 [0-9]
\D:非数字
\w:数字、字母、下划线、中文
\W:非\w
\s:所有的空白字符
\S:非空白
数量修饰:
* :任意多次。>=0
+:至少一次。>=1
?:可有可无 0次或者1次
{m}:固定m次
{m,} : 至少m次
{m,n}:m-n次
边界:
\b \B
$ :以..结尾
^ :以..开始
分组:
() : 视为一个整体
() \1 \2 : 子模式
贪婪模式:
.*? , .+?
re.I :忽略大小写。
re.M:多行匹配。
re.S:单行匹配。
match:从开头开始找。
search:从任意位置开始找。
findall:
正则替换:
re.sub(正则表达式,替换内容,字符串)
可以用一个函数作为参数
下面是一个简单的用正则表达式匹配字符串的例子:
import re
string = '<p><div><span>猪八戒</span></div></p>'
pattern = re.compile(r'<(\w+)><(\w+)>\w+</\2></\1>')
ret = pattern.search(string)
print(ret)
下面是贪婪模式的应用例子:
import re
string = '<div>猪八戒</div></div></div>'
pattern = re.compile(r'<\w+>.*</\w+>')
pattern2 = re.compile(r'<\w+>.*?</\w+>')
ret = pattern.search(string)
ret2 = pattern2.search(string)
print(ret)
print(ret2)
运行结果:
<re.Match object; span=(0, 26), match='<div>猪八戒</div></div></div>'>
<re.Match object; span=(0, 14), match='<div>猪八戒</div>'>
下面是正则替换的例子:
import re
string = 'you are my dsds'
pattern = re.compile(r'dsds')
ret = re.sub(r'dsds', 'a', string) \1
用a在string中替换dsds
ret = pattern.sub('aaa', string) \2
# 用aaa在string替换pattern中的内容
print(ret)
1的运行结果是:
you are my a
2的运行结果是:
you are my aaa
利用正则函数进行替换
import re
def fn(a):
ret = int(a.group())
return str(ret - 10)
string = '178是最受欢迎的身高'
pattern = re.compile(r'\d+')
ret = pattern.sub(fn, string)
print(ret)
下面是一个爬去语录网的标题和文章的例子(用的是正则表达式进行匹配):
'''
将网站的标题和内容爬取下来
'''
import urllib.request
import urllib.parse
import re
def get_text(url, title):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/63.0.3239.132 Safari/537.36',
}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request).read().decode()
# 写一个正则移除网页中的全部图片
# pattern_s = re.compile(r'<img src=".*?" title=".*?" alt=".*?" .*?>')
# pattern_s.sub('', response)
pattern = re.compile(r'<div class="neirong">(.*?)</div>', re.S)
lt = pattern.findall(response)
# print(lt)
with open('lizhi.html', 'a', encoding='utf8') as fp:
fp.write(title + '\n\n\n' + lt[0])
def response_buile(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/63.0.3239.132 Safari/537.36',
}
# 构建请求
request = urllib.request.Request(url=url, headers=headers)
# 获取响应
response = urllib.request.urlopen(request).read().decode()
# print(response)
# 构建正则表达式进行筛选
pattern = re.compile(r'<li>.*?<a href="(.*?).html">(.*?)</a>.*?</li>', re.S)
lt = pattern.findall(response)
# print(lt)
for it in lt:
url_g = 'http://www.yikexun.cn' + it[0] + '.html'
# print(url_g)
get_text(url_g, it[-1])
def main():
url = 'http://www.yikexun.cn/niandujingdianyulu/2013yulu/list_60_'
# 构建请求网页中共同的部分http://www.yikexun.cn/niandujingdianyulu/2013yulu/list_60_1.html
print("一点点语录网爬取!!")
start_page = int(input("请输入需要爬取的起始页码:"))
end_page = int(input("请输入需要爬取的结束页码:"))
for page in range(start_page, end_page + 1):
print("正在爬取第%s页", str(page))
# 构建完整的url
url_t = url + str(page) + '.html'
# print(url_t)
# 根据url构建请求获取响应
response_buile(url_t)
main()