python正则表达式
1.基本介绍
正则表达式是一个很强大的字符串处理工具,在网络爬虫过程中会不可避免的与字符串打交道,本文将介绍一下正则表达式的用法,也当做是自己的一个学习记录
2.用法介绍
2.1基本规则
[ ]:
a): 由一对方括号括起来的字符,表明一个字符集合,能够匹配包含在其中的任意一个字符,比如[123qwe],表明字符 '1' '2' '3' 'q' 'w' 'e'都符合匹配要求。
b):在'[ ]'中还可以通过 ‘-’短横杠来指定一个字符集合范围,比如[a-z]来指示所有小写英文字母,[0-9]指示匹配所有数字。
c):如果在'[ ]'里面的开头写一个 ‘^’号,则表示取非,如[^0-9]表示不匹配数字,但如果'^'不在开头,则不再表示取非,而表示一个普通字符,如[a-z^A-Z]表示匹配所有英文字符和字符'^'
|:
将两个规则并列起来,以'|'连接,表示只要满足其中之一就可以匹配,比如[a-z]|[A-Z]表示匹配所有英文字母,等价于[a-zA-Z]。
print(re.findall(r'[a-z]|[A-Z]', 'Asd')) # 输出结果:['A', 's', 'd'] print(re.findall(r'[a-zA-Z]', 'Asd')) # 输出结果:['A', 's', 'd']
.:
匹配除换行符'\n'外所有字符,如果使用了'S'选项,匹配包括'\n'的所有字符
s = '123\n456\n789' print(re.findall(r'.+', s)) #输出结果: ['123', '456', '789'] print(re.findall(r'.+', s, re.S)) #输出结果: ['123\n456\n789']
^ $:
^ 匹配字符串开头,在'M'模式下可以匹配每一行的行首
$ 匹配字符串结尾,在'M'模式下可以匹配每一行的行尾
\d:
匹配数字,等价于[0-9]
'\D':
匹配非数字,等价于[^0-9]
'\w':
匹配字母和数字,等价于[a-zA-Z0-9]
'\W':
匹配非字母和数字,等价于[^a-zA-Z0-9]
'\s':
匹配间隔符,即匹配空格,制表,回车等符号,等价于[\t\r\n\f\v]
'\S':
匹配非间隔符,等价于[^\t\r\n\f\v]
'\A':
匹配字符串开头,它和'^'的区别是'\A'只匹配字符串开头,而'^'在'M'模式下可以匹配其他行行首
s = '123\nabc\n789' print(re.findall('^\d', s, re.M)) # 匹配位于行首的数字 #运行结果: ['1', '7'] print(re.findall('\A\d', s, re.M)) # 匹配位于字符串开头的数字 #运行结果:['1']
'\Z':
匹配字符串结尾,它和'$'的区别是'\Z'只匹配字符串结尾,而'$'在'M'模式下可以匹配其他行行尾
s = '123\nabc\n789' print(re.findall('\d$', s, re.M)) # 匹配位于行尾的数字 # 运行结果:['3', '9'] print(re.findall('\d\Z', s, re.M)) # 匹配位于字符串尾的数字 # 运行结果:['9']
'\b':
匹配单词边界,比如空格等,不过它是一个'0'长度字符,它匹配完的字符串不会包括那个分界的字符。而如果用'\s'来匹配的话,则匹配出的字符串中包含那个分界符。
s = 'ab abcsd bc ab aaa' print(re.findall(r'\bab\b', s)) # 匹配一个单独的单词 'ab',则当它是其他单词的一部分的时候不匹配 # 输出结果:['ab', 'ab'] print(re.findall(r'\sab\s', s)) # 匹配单独单词'ab' ,不过要注意 前后各有一个空格 # 输出结果:[' ab ']
'\B':
和’\b’相反,它只匹配非边界的字符。它同样是个0长度字符。
2.2重复
'*':
0或多次匹配,表示匹配前面的规则0次或多次
'+':
1次或多次匹配,表示匹配前面的规则至少一次,可以多次匹配
s = 'abbe abs2112 abs223bb 99cc' print(re.findall(r'\b[a-z]+\d*\b', s)) # 必须至少一个字母开头,以连续数字或没有数字结尾 # 输出结果:['abbe', 'abs2112']
'?':
0或1次匹配,表示只匹配前面规则的0次或1次
s = 'e212 abs2112 abs223bb w99cc 124' print(re.findall(r'\b[a-z]?\d*\b', s)) # 输出结果:['e212', '', '', '', '', '', '', '', '124', '']