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

原文地址:https://www.cnblogs.com/Han-org/p/8915896.html

时间: 2024-10-11 03:05:55

python re正则的相关文章

python 中文正则表达匹配

需求:由于某个n年前的工具的错误,在复制一批文件的时候产生了大量的"复件xxxxxxx""复件(2)XXXXX"等类似文件,由于目录结构深,文件多,预计在5000万个,但是有多少这种错误的文件不清楚,因此写个脚本遍历删除. #encoding=utf-8 #author: skybug #date: 2014-05-11 #function: 遍历指目录,删除中文开头的文件名的图片 import os,re cnt = 0 pattern = re.compile(

python通过正则获取字符串指定开头和结尾的中间字符串的代码

下面的代码是关于python通过正则获取字符串指定开头和结尾的中间字符串的代码,应该能对各位朋友有些好处. def GetMiddleStr(content,startStr,endStr): patternStr = r'%s(.+?)%s'%(startStr,endStr) p = re.compile(patternStr,re.IGNORECASE) m= re.match(p,content) if m: return m.group(1) 原文地址:http://blog.51ct

python基础-正则2

正则函数 Python提供re模块,包含所有正则表达式的功能 由于python的字符串本身也有\转义,所以需要注意: s = "ABC\\-001" 对应的正则表达式应为:'ABC\-001' 用python的r前缀,就不用考虑转义问题 可以使用 s = r'ABC\-001' 对应的正则表达式为:'ABC\-001' match() 判断是否匹配成功,如果匹配成功,返回一个match对象,否则返回None test = "用户输入的字符串" if re.match

python基础-正则1

什么是正则表达式? 正则表达式是一种小型的\高度专业化的变成语言,主要用于字符串处理 正则表达式是一种通用语言,在python中通过re模块实现,import re 工具:在线正则表达式测试 http://tool.oschina.net/regex/ http://www.jb51.net/shouce/jquery1.82/regexp.html 字符匹配-普通字符 大多数字符和自身完全匹配.如表达式shit与字符串"shit"完全匹配 字符匹配-元字符 ^ 匹配行首 $ 匹配行尾

Python之正则

从学习Python至今,发现很多时候是将Python作为一种工具.特别在文本处理方面,使用起来更是游刃有余. 说到文本处理,那么正则表达式必然是一个绝好的工具,它能将一些繁杂的字符搜索或者替换以非常简洁的方式完成. 我们在处理文本的时候,或是查询抓取,或是替换. 一.查找 如果你想自己实现这样的功能模块,输入某一个ip地址,得到这个ip地址所在地区的详细信息. 然后你发现http://ip138.com 可以查出很详细的数据 但是人家没有提供api供外部调用,但是我们可以通过代码模拟查询然后对结

python - re正则匹配模块

re模块 re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对象拥有一系列方法用于正则表达式匹配和替换. re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数. re.match函数 re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. # (匹配规则,字符串,特殊标志) re.match(pattern

python与正则

想了解正则的使用,请点击:正则表达式.每种编程语言有一些独特的匹配方式,python也不例外: 语法 含义 表达实例 完整匹配匹配的字符串 \A 仅匹配字符串开头 \Aabc abc \Z 仅匹配字符串末尾 abc\Z abc (?P 分组,除了原有编号再指定一个额外的别名 (?P abcabc (?P=name) 引用别名为 (?P 1abc1\n5abc5 在python语句中要匹配字符,需要在表达式中写\\\\,因为python编译需要\\表示\,同时正则也是.或者使用python原生字符

Python中正则匹配使用findall时的注意事项

在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串  "[email protected]@[email protected]@asdfcom" 想匹配出里面所有的邮箱地址,该怎么实现呢? 写了个正则,测试一下: >>> import re >>> s = "[email protected]@[email protected]@asdfcom" >>> pat

python之正则re模块

1.正则的语法:  中文教程:https://wizardforcel.gitbooks.io/py-re-guide/content/index.html 1.re的数量词: 1. ^   匹配度字符串开始位置 2. $   匹配字符串结束的地方: tr = 'jgko22rkdljgkd' r2 = re.findall('^jgkd', tr) print(r2) # []是空的 r4 = re.findall('^jgko', tr) print(r4) # ['jgko'] r3 =