此为教程笔记
教程地址:https://study.163.com/course/courseMain.htm?courseId=1209401897
感谢老师:城市数据团大鹏
1.正则表达式快速上手
1.1 正则表达式是什么?
1.2 爬虫中正则表达式的作用是什么
2 正则表达式的模式
简单理解,就是原来表示转义字符的不再表示转义,而就是它原来的意思。如“\n”在python中表示换行,如果想要它表示“\n”,就要用r’\n’
在正则表达式中,一般都用r’‘写逻辑公式,避免遇到转义字符。是一种较懒的方法。
模式非常多,但主要分为以上6类。大部分模式以及对应的描述如下
描述
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 “匹配位置” |
$ | 匹配字符串的末尾 “匹配位置” |
import re
# 匹配位置
s = 'hello word!'
m = r'^h' # 匹配模式,
# print(re.match(m,s)) # 匹配h开头的字符
# 结果 <re.Match object; span=(0, 1), match='h'>
m1 = r'!$'
# print(re.match(m1,s)) # 匹配!结尾的字符
# 结果为None,是因为match函数是从起始位置还是匹配,正确的写法如下
m2 = r'.*!$'
print(re.match(m2,s)) # 匹配!结尾的字符
# 结果:<re.Match object; span=(0, 11), match='hello word!'>
这里需要注意^和 的 位 置 , 是 在 字 符 前 面 , 的位置,^是在字符前面, 的位置,是在字符前面,在字符后面
用于匹配内容的常用模式
示例
用于匹配次数
示例 贪婪匹配(re*)和非贪婪匹配(re*?)
s1 = 'abc1wabc1w'
print(re.match(r'.+[1w]',s1))
# 结果 <re.Match object; span=(0, 10), match='abc1wabc1w'>
print(re.match(r'.*[1w]',s1)) # 贪婪匹配,尽可能多的匹配,直到找到最后一个匹配项
# 结果 <re.Match object; span=(0, 10), match='abc1wabc1w'>
print(re.match(r'.*?[1w]','abc1wabc1w')) # 匹配到一个就停止
# 结果 <re.Match object; span=(0, 4), match='abc1'>
示例 re{n} 和re{n,m}
s2 = 'agfbbbcccbbrrb'
print(re.match(r'.*?[b]{2}',s2)) # 非贪婪匹配,匹配到两个b就停止
# <re.Match object; span=(0, 5), match='agfbb'>
print(re.match(r'.*[b]{2}',s2)) # 贪婪匹配,匹配两个b
# <re.Match object; span=(0, 11), match='agfbbbcccbb'>
print(re.match(r'.*[b]{1,2}',s2)) # 贪婪匹配,1到2个b
# <re.Match object; span=(0, 14), match='agfbbbcccbbrrb'>
print(re.match(r'.*?[b]{1,2}',s2)) # 非贪婪匹配,1到2个b
# <re.Match object; span=(0, 5), match='agfbb'>
3 字符搜索
re,match()从字符起始开始搜索,re.search()从字符中间任意位置搜索。
示例 re.findall()
s3 = 'one12 twothree 34 four'
print(re.findall(r'\d',s3)) # 找到所有数字
# 结果 ['1', '2', '3', '4']
print(re.findall(r'\d\d',s3)) # 找两个一组的
# ['12', '34']
4 字符替换与分割
替换