正则表达式 regex
动机 : 对字符串(文本)的操作是计算机的主要工作之一
从文本或大字符串中找到某一类型的字串
为了解决以上问题----》 正则表达式
定义 : 本质是由一系列字符和特殊符号组成的字串,用来表示一定规则的某 一类字符串。
优点和使用 :
1.是一个独立的技术
2.能被多种编程语言使用 python ---》 re
re.findall(regex,string)
功能 : 按照正则表达式匹配字符串
参数 : regex 正则表达式
string 目标字符串
返回值 : 返回一个列表,列表中是所有匹配到的内容
正则元字符
* 单个字符
匹配规则 : 匹配相应的字符
e.g. ab ab
In [4]: re.findall('ab','abcdefabg')
Out[4]: ['ab', 'ab']
* 匹配单个字符
元字符 : .
匹配规则 : 匹配除‘
’外的任意一个字符
e.g. f.o ---> foo fao fbo
In [6]: re.findall('f.o','faosfaafbo')
Out[6]: ['fao', 'fbo']
* 匹配字符串的开头位置
元字符 : ^
匹配规则 : ^位置必须为字符串的开始位置才可,通常和其他元字符同用
e.g. ^abc abcdef
In [8]: re.findall('^abc','abcdefgh')
Out[8]: ['abc']
* 匹配字符串结尾
元字符: $
匹配规则 : 匹配字符串的结尾位置
e.g. py$ a.py
In [11]: re.findall('py$','a.py')
Out[11]: ['py']
* 匹配重复
元字符 : *
匹配规则 : 匹配前面出现的正则表达式0次或多次
e.g. ab* a ab abbbbb abbbbbb
In [17]: re.findall('ab*','aabbabbljlk')
Out[17]: ['a', 'abb', 'abb']
* 匹配重复
元字符 : +
匹配规则 : 匹配前面出现的正则表达式1次或多次
n [18]: re.findall('ab+','aabbabbljlk')
Out[18]: ['abb', 'abb']
* 匹配重复
元字符 : ?
匹配规则: 匹配前面出现的正则表达式0次或1次
In [20]: re.findall('ab?','aabbabbljlk')
Out[20]: ['a', 'ab', 'ab']
* 匹配重复
元字符 : {n}
匹配规则: 匹配指定重复的次数
In [22]: re.findall('ab{2}','aabbabbljlk')
Out[22]: ['abb', 'abb']
* 匹配重复
元字符 : {m,n}
匹配规则 : 匹配重复m次到n次
In [26]: re.findall('ab{2,5}','aabbabbbbbbljlk')
Out[26]: ['abb', 'abbbbb']
* 字符集匹配
元字符 : [abcd]
匹配规则 : 匹配字符集中任意一个字符
* 匹配字符区间
元字符 : [0-9] [a-z] [A-Z]
匹配规则 : 匹配区间内任意一个字符 不同区间可以写在一起,同时还能添加其他的字符集
e.g. [_3-9a-z]
In [30]: re.findall('[_0-9a-zA-Z]+','hello world hello py_2')
Out[30]: ['hello', 'world', 'hello', 'py_2']
*集合取反
元字符 [^ ....]
匹配规则 : 匹配任意一个不再集合中的字符
e.g. [^0-9] a g & $
In [31]: re.findall('[^0-9]+','hello world hello py_2')
Out[31]: ['hello world hello py_']
元字符 : d D
匹配规则 : 任意一个数字字符 任意一个非数字字符
In [32]: re.findall('d{8}','12345678')
Out[32]: ['12345678']
元字符 : w W
匹配规则: 任意一个数字字母下划线 任意一个特殊字符
[_0-9a-zA-Z] [^_0-9a-zA-Z]
元字符: s S
匹配规则: 任意空字符 匹配任意非空字符
[
]
In [41]: re.findall('sS+','hello world nihao china')
Out[41]: [' world', ' nihao', ' china']
元字符 : A
匹配规则: 匹配字符串的开头位置^ 匹配字符串的结尾位置$
In [52]: re.findall('Afoo','foo')
Out[52]: ['foo']
元字符: B
匹配规则 : 匹配单词边界位置 匹配非单词边界位置
单词边界 : 数字字母下划线和其他字符交界的位置认为是单词边界
In [59]: re.findall(r'foo','foo food foot')
Out[59]: ['foo']
In [60]: re.findall(r'fooB','foo food foot')
Out[60]: ['foo', 'foo']
元字符 : |
匹配规则 : 连接多个正则表达式 形成或关系
In [64]: re.findall('abc|bcd','abcdefbcdef')
Out[64]: ['abc', 'bcd']
转义字符
* $ ? + d s
1.正则表达式中有很多特殊字符为元字符,如果在设定匹配时需要匹配到特殊字符则用转义
e.g. ----> \ * ---> * d ----> \d
2. 当使用某个编程语言时,正则表达式往往要以字符串的形式传入
而编程语言的字符串又有转义性质
python str -----》 raw str 认为字符串中为原始内容,不进行转义
\* *
匹配单个字符 : 普通字符 . d D w W s S [...] [^...]
匹配位置 : ^ $ A B
匹配重复次数 : * + ? {n} {m,n}
其他 : |
贪婪和非贪婪
贪婪模式 : 当重复次数不确定是,正则表达式总是尽可能多的向后匹配
* + ? {m,n}
非贪婪模式 : 在重复的元字符后加?
In [94]: re.findall('ab*?','abbbbbbba')
Out[94]: ['a', 'a']
In [95]: re.findall('ab+?','abbbbbbba')
Out[95]: ['ab']
正则表达式子组
在一个正则表达式中可以用()取正则表达式的一部分,为该正则表达式的一个子组
regex (ab)*cdef
子组能干什么
*子组表示一个内部的整体,可以改变重复的元字符作用范围
*很多编程语言函数可以单独提取子组的内容
*在使用和调用上更加方便
一个正则表达式中原则上可以有很多子组。从外到内,从左到有分别称为第一子组,第二子组。。。。。。子组不要交叉
捕获组
子组命名 (?P<name>abcd)
子组调用 (?P=name)
(?P<dog>ab)cdef(?P=dog)
非捕获组
your time:
匹配长度为8-10位的密码,必须以字母开头,数字字母下划线组成
In [2]: re.findall(r'^[a-zA-Z]w{7,9}$','abc123_a')
Out[2]: ['abc123_a']
匹配身份证号
In [6]: re.search(r'd{17}(d|x)','123123123123123123').group()
Out[6]: '123123123123123123'
匹配一段文字中以大写字母开头的单词
In [14]: re.findall(r'[A-Z]w*',data)
Out[14]: ['Python', 'Hello', 'World']
python ---- > regex
模块 re
compile(pattern, flags=0)
功能 : 生成正则表达式对象
参数 : pattern : 正则表达式
flags : 扩展标志位,默认为0表示不进行任何扩展
返回值 : 正则表达式对象
obj = compile('abc')
以下 **** 中的函数既能re直接调用又能compile对象调用
**************************************************
re.findall(pattern, string, flags=0)
功能 : 根据正则表达式匹配目标字符串
参数 : pattern 正则表达式
string 目标字符串
flags : 正则扩展标志位
返回值 : 匹配到的所有内容以列表返回
如果有分组则只返回子组能匹配到的内容
obj.findall(string=None, pos=0,endpos=99999)
功能 : 根据正则表达式匹配目标字符串
参数 : string 目标字符串
pos : 匹配目标字符串的起始位置
endpos : 匹配目标字符串的结束位置
返回值 : 匹配到的所有内容以列表返回
如果有分组则只返回子组能匹配到的内容
finditer()
功能 : 同findall
参数 : 同findall
返回值 : 返回一个迭代对象,迭代获取的每个值为match obj
*match 对象 : finditer match fullmatch search
这些函数将正则匹配到的结果以match对象的形式给出,方便进行过具体的操作
fullmatch()
功能 : 用正则表达式完全匹配某个字符串
参数 : 目标字符串
返回值 : 返回匹配到的match对象,如果没有匹配到返回None
match()
功能 : 匹配字符串的开头
参数 : 目标字符串
返回值i: 如果匹配到内容返回match object 否则返回None
search()
功能 : 匹配第一处符合正则的字串
参数 : 目标字串
返回值: 如果匹配到内容返回match object 否则返回None
split()
功能 : 按照正则表达式切割字符串
参数 : 目标字符串
返回值: 将切割后的字符串放入列表
sub(re_str,string,max)
功能 : 用指定字符串替换正则表达式匹配到的部分
参数 : re_str 待替换的字符串
string : 目标字符串
max : 最多替换几处
返回值 : 替换后的字符串
subn()
功能 : 用指定字符串替换正则表达式匹配到的部分
参数 : re_str 待替换的字符串
string : 目标字符串
max : 最多替换几处
返回值 : 返回值为二元元组,第一项为替换后的字符串,第二项为实际替换几处
****************************************************
compile返回对象的属性
flags : 正则表达式表示位的整形表示
pattern : 正则表达式
groupindex : 返回以捕获组的名称为键,第几组为值得字典
groups: 正则表达式中一共有多少个子组
match search fullmatch finditer
match对象属性和方法
属性:
pos : 匹配目标字符串的开始位置
endpos : 匹配目标字符串的结束位置
lastgroup:获取最后一个子组的名称,如果没名字则为None
lastindex:或许最后一个子组是第几子组
re : match匹配所用的正则表达式
regs : 正则表达式整体及每个子组所匹配的部分
string : match匹配的目标字符串
方法:
start()
得到匹配内容在字符串中的开始位置
end()
得到匹配内容在字符串中的结束位置(结束字符下标的下一个)
span()
得到匹配到的内容在字符串中的起止位置
group(n)
功能: 获取match对象匹配到的内容
参数: n 默认为0表示 整个正则匹配到的内容
当给n附一个正整数时则表示要获取第n个子组匹配内容
返回值:返回匹配到的字符串
groups()
功能 : 获取所有子组匹配到的内容
groupdict()
功能 : 将捕获组的名称和匹配的内容形成键值对关系
re.compile re.findall re.match re.search .....
'A',
'ASCII',
'S' 让 . 可以匹配换行
'DOTALL',
'I', 忽略大小写
'IGNORECASE'
'L',
'LOCALE',
'M', 作用于 ^ $ 使其能匹配每行的开头结尾
'MULTILINE'
'T',
'TEMPLATE',
'U',
'UNICODE'
'X' 让你的正则可以添加以#开头的注释
'VERBOSE',
当多个flag同时使用时 中间用竖线分割
re.I | re.S