一、简介
正则表达式不是Python特有的语言,它是一门通用语言,在各类的编程语言中,都有引用,它的主要作用是用于处理字符串,它的功能非常强大,这里我只是介绍在Python内的一些操作
二、元字符
在介绍使用时候,不可避免要先了解元字符,下表只是列出常用的元字符。
三、根据前面的元字符,进行举例:
在使用Python的正则表达式前,需要先导入re模块,在这里我们是用findall进行举例:
函数参数说明:
1、"."例子:
var = re.findall('exm.ple', 'example') print(var) #输出,如成功匹配,会输出一个列表,否则是以空列表 ['example'] 注意"."只匹配一个字符
2、"^"例子:
var = re.findall('^exam', 'example') print(var) # 输出 ['exam']
3、"$"例子:
var = re.findall('ple$', 'example') print(var) # 输出 ['ple']
4、"*"例子:
var = re.findall('x*a', 'exxxample') print(var) # 输出 ['xxxa']
这里要强调一下,一定是"*"前面的字母0次或多次
5、"+"例子:
var = re.findall('ex*a', 'eample') print(var) # 输出 ['ea'] var = re.findall('ex+a', 'eample') print(var) # 输出 []
6、"?"例子:
var = re.findall('ex?a', 'eample') print(var) # 输出 ['ea'] var = re.findall('e?a', 'eample') print(var) # 输出 ['ea']
7、"{ }"例子:
var = re.findall('ex{1}a', 'example') print(var) # 输出 ['exa'] var = re.findall('ex{2}a', 'example') print(var) # 输出 []
8、"{m,n}"例子:
var = re.findall('ex{1,5}a', 'exxxample') print(var) # 输出 ['exxxa'] var = re.findall('ex{,5}a', 'eample') print(var) # 输出 ['ea'] var = re.findall('ex{1,}a', 'exxxxxxxxxxample') print(var) # 输出 ['exxxxxxxxxxa']
9、"[ ]"例子:
var = re.findall('e[a-z]a', 'example') print(var) # 输出 ['exa'] var = re.findall('e[a-z]a', 'exxample') print(var) # 输出 []
10、"[^]"例子:
var = re.findall('e[x]a', 'example') print(var) # 输出 ['exa'] var = re.findall('e[^x]a', 'example') print(var) # 输出 []
11、"[*]"例子:
var = re.findall('e[x*]a', 'example') print(var) # 输出 ['exa'] var = re.findall('e[x*]a', 'e*ample') print(var) # 输出 ['e*a']
四、特殊字符
这里只单独对"\b"进行一个解释
var = re.findall(r'i\b', 'i am big') # 只匹配单词i print(var) # 输出: ['i'] var = re.findall(r'i\b', 'i&am big') # 只匹配单词i print(var) # 输出: ['i'] var = re.findall(r'\bapp', 'myapp app aapple') print(var) # 输出 ['app']
这里注意一下,一定要加r,建议以后在进行正则的时候都加上r
五、设置flags不区分大小写
var = re.findall('com', 'COMwww') # 默认区分大小写 print(var) # 输出 [] var = re.findall('com', 'COMwww', re.I) # 通过修改flag,支持不区分大小写 print(var) # 输出 ['COM']
六、re模块下的方法
1、sub字符串替换
sub(pattern,repl,string,count,flags)
var = re.sub('a', 'b', 'aaaa') print(var) # 输出 bbbb var = re.sub('a', 'b', 'aaaa',2) print(var) bbaa
2、subn不但进行字符串替换,还在最后告诉你替换的次数
var = re.subn('a', 'b', 'aaaa') print(var) # 输出 ('bbbb', 4)
3、split
var = re.split('\d+', 'one1two2three') print(var) # 输出 ['one', 'two', 'three']
a = re.split('[0-9]', 'aa22bb33cc44dd') print(a) a = re.split('[0-9]+', 'aa22bb33cc44dd') print(a)
import re var = re.split('\d+', 'one1two2three3') var_list = [i for i in var if i] print(var) # 列表里面有空格 print(var_list) # 去掉列表内的空格 # 输出 ['one', 'two', 'three', ''] ['one', 'two', 'three']
4、match 较少是用
只匹配字符串的起始位置,一旦匹配成功,就是一个match object对象,对象拥有以下几个方法:
group() 返回被RE匹配的字符串
start()返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元祖包含匹配(开始,结束)
5、search,可以匹配
七、分组
正则分组:去已经提取到的数据中再进行提取数据
1、search分组
origin = "has" r = re.search("h\w+", origin) print(r.group()) # 获取匹配到的所有结果 # 输出 has # 这个时候我要想把取出的has在进行过滤 r = re.search("h(\w+)", origin) print(r.group()) # 获取匹配到的所有结果 print(r.groups()) # 获取模型中匹配到的分组结果 print(r.groupdict()) # 获取模型中匹配到的分组结果 # 输出 has ('as',) {} r = re.search("h(?P<name>\w+)", origin) # ?P<name>不代表任何过滤条件 print(r.group()) # 获取匹配到的所有结果 print(r.groups()) # 获取模型中匹配到的分组结果 print(r.groupdict()) # 获取模型中匹配到的分组结果 # 输出 has ('as',) {'name': 'as'}
2、findall分组
origin = "has asdfasf hal" r = re.findall("h(\w+)", origin) print(r) # 获取匹配到的所有结果 # 输出 ['as', 'al'] origin = "hasaabc asdfasf halaabc" r = re.findall("h(\w+)aabc", origin) print(r) # 获取匹配到的所有结果 # 输出 ['as', 'al'] r = re.findall("h(\w+)a(ab)c", origin) # 整体先匹配hasaabc 和 halaabc,再进行分组 print(r) # 获取匹配到的所有结果 # 输出 [('as', 'ab'), ('al', 'ab')]
3、split分组
origin = "hello ab aaabbb" r = re.split('ab', origin, 1) # 未分组 print(r) # 输出 ['hello ', ' aaabbb'] r = re.split('(ab)', origin, 1) # 分组 print(r) # 输出 ['hello ', 'ab', ' aaabbb']
'(?P<name>...)'
分组匹配 re.search(
"(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})"
,
"371481199306143242"
).groupdict(
"city"
) 结果{
'province'
:
'3714'
,
'city'
:
'81'
,
'birthday'
:
'1993'
}