python re正则

正则表达式 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']


* 匹配单个字符

元字符 : .
匹配规则 : 匹配除‘\n’外的任意一个字符

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
匹配规则: 任意空字符 匹配任意非空字符
[ \n\r\t\0]

In [41]: re.findall('\s\S+','hello world nihao china')
Out[41]: [' world', ' nihao', ' china']


元字符 : \A \Z
匹配规则: 匹配字符串的开头位置^ 匹配字符串的结尾位置$

In [52]: re.findall('\Afoo\Z','foo')
Out[52]: ['foo']


元字符: \b \B
匹配规则 : 匹配单词边界位置 匹配非单词边界位置

单词边界 : 数字字母下划线和其他字符交界的位置认为是单词边界

In [59]: re.findall(r'foo\b','foo food foot')
Out[59]: ['foo']

In [60]: re.findall(r'foo\B','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 \Z \b \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'\b[A-Z]\w*\b',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

 

posted @ 2018-04-23 09:39  韩男神  阅读(647)  评论(0编辑  收藏  举报