廖雪峰老师的python教程
正则表达式的功能十分强大,用法也十分的多,在廖雪峰老师的python教程中也只是点到为止,仅做了解作用,更深入还希望查阅工具。
正则表达式也是用字符串表示的,有字符表示字符的方法
\d
匹配一个数字
\w
匹配一个数字或字母
.
匹配任何字符
\s
匹配一个空格(包括tab)
如 '\w\w\s\d.'
可以匹配 'py 3!'
*
匹配包括0个的任意个字符
+
表示至少1个字符
?
表示0或1个字符
{n}
表示n个字符
{n-m}
表示n-m个字符
例如:\d{3}\-\d{3,8}
\d{3}
代表着可以识别3个字符
\d{3-8}
代表着可以识别3-8个字符
\-
可以转义 \ 字符
所以这段就可以识别'010-123456'
这种字符串
精确的匹配,可以用[]
划定范围:
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}
限定前面一个大小写字母或_ 加上后面一个最长20字符的可以包括大小写字母和_的字符串
A|B
代表A或B
^
为行开头 例如^\d
为行开头必须为数字
$
为行末尾 例如\d$
为行末尾必须为数字
使用r
转义,可以直接将字符串变为正则表达式字符串
例如r'python'
的正则表达式字符串就是'python'
引入正则表达式,可以使用re模块
import re
match()
判断是否匹配,匹配返回一个match对象,不匹配返回none
常用形式
test = '用户输入的字符串'
if re.match(r'正则表达式', test):
print('ok')
else:
print('failed')
正则表达式中使用spilt()
切割更加方便
re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']
例如在这中间,就可以按照\s(空格) \,(逗号) ; (分号)切割
正则表达式还可以进行分组操作
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
m.group(0)
'010-12345'
m.group(1)
'010'
m.group(2)
'12345'
如例,使用^(\d{3})-(\d{3,8})$
将字符串分为前后两组,前面固定3个字符,后面3-8个字符
其中group(0)固定为原字符串
group(1)与group(2)是前后分割的字符串
正则匹配默认为贪婪匹配,如:
re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
在前面的分组中,规定了数字类型,但没有限定个数,会默认匹配尽量多的数字,所以后面的一组就没有机会匹配
re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
在此情况下,使用\d+?
令其进行非贪婪匹配(尽可能少的匹配),所以后字符串尽可能的多匹配0,出现了下面的情况。
正则表达式在基于python的爬虫中利用较多,之后需要深度的学习。