Python正则表达式规则解析

python正则表达式的实现主要是通过python的re库,re库是python的标准库,所以无须安装

1.正则表达式的常用操作符

操作符说明实例
.表示任何单个字符 
[ ]字符集,对单个字符给出取值范围[abc]表示a、b、c,[a‐z]表示a到z单个字符
[^ ]非字符集,对单个字符给出排除范围[^abc]表示非a或b或c的单个字符
*前一个字符0次或无限次扩展abc* 表示ab、abc、abcc、abccc等
+前一个字符1次或无限次扩展abc+ 表示abc、abcc、abccc等
?前一个字符0次或1次扩展abc? 表示ab、abc
|左右表达式任意一个abc|def表示abc、def
{m}扩展前一个字符m次ab{2}c表示abbc
{m,n}扩展前一个字符m至n次(含n)ab{1,2}c表示abc、abbc
^匹配字符串开头^abc表示abc且在一个字符串的开头
$匹配字符串结尾abc$表示abc且在一个字符串的结尾
( )分组标记,内部只能使用操作符|(abc)表示abc,(abc|def)表示abc、def
\d数字,等价于[0‐9] 
\w单词字符,等价于[A‐Za‐z0‐9_] 

2.re库的使用

主要功能函数

函数说明
re.search()在一个字符串中搜索匹配正则表达式的第一个位置,匹配成功返回match对象,否则返回None
re.match()从一个字符串的开始位置起匹配正则表达式,匹配成功返回match对象,否则返回None
re.findall()搜索字符串,以列表类型返回全部能匹配的子串
re.split()将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.finditer()搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
re.sub()在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

更详细的说明请参考Python re文档

例如:

re.search(pattern,string,flags=0)

 

其中:

  • pattern : 正则表达式的字符串或原生字符串表示

  • string : 待匹配字符串

  • flags : 正则表达式使用时的控制标记

常用标记说明
re.I或re.IGNORECASE忽略正则表达式的大小写,[A‐Z]能够匹配小写字符
re.M或re.MULTILINE正则表达式中的^操作符能够将给定字符串的每行当作匹配开始
re.S或re.DOTALL正则表达式中的.操作符能够匹配所有字符,默认匹配除换行外的所有字符
>>> import re
>>> m = re.search(r'[1-9]\d{5}', 'abc1234567')
>>> if m:
...     m.group(0)
...
'123456'

 

还有一种写法是这样的

>>> import re
>>> t = re.compile(r'[1-9]\d{5}')
>>> m = t.search('abc1234567')
>>> if m:
...     m.group(0)
...
'123456'

 

第二种写法的好处是:当要对一个正则表达式进行多次字符串匹配时,可以只编译一次,匹配多次,可以提升效率

3.Match对象

属性说明
.string待匹配的文本
.re匹配时使用的patter对象(正则表达式)
.pos正则表达式搜索文本的开始位置
.endpos正则表达式搜索文本的结束位置
.group()获得匹配后的字符串
.start()匹配字符串在原始字符串的开始位置
.end()匹配字符串在原始字符串的结束位置
.span()返回(.start(), .end())

4.re库的贪婪匹配

re库默认采用贪婪匹配,即输出匹配长的子串

例如

>>> match = re.search(r'PY.*N', 'PYANBNCNDN')   
>>> match.group(0)   
'PYANBNCNDN'

 

那么,如何输出最小的匹配呢

可以在.*后面加个?,就像这样

>>> match = re.search(r'PY.*?N', 'PYANBNCNDN')   
>>> match.group(0) 
'PYAN'

 

还有一些其他的操作符

操作符说明
*?前一个字符0次或无限次扩展,小匹配
+?前一个字符1次或无限次扩展,小匹配
??前一个字符0次或1次扩展,小匹配
{m,n}?扩展前一个字符m至n次(含n),最小匹配

正则表达式说明

函数说明
sub(pattern,repl,string)把字符串中的所有匹配表达式pattern中的地方替换成repl
[^**]表示不匹配此字符集中的任何一个字符
\u4e00-\u9fa5汉字的unicode范围
\u0030-\u0039数字的unicode范围
\u0041-\u005a大写字母unicode范围
\u0061-\u007a小写字母unicode范围
\uAC00-\uD7AF韩文的unicode范围
\u3040-\u31FF日文的unicode范围

关注公众号:

 

posted @ 2020-04-07 15:55  QYGQH  阅读(8)  评论(0编辑  收藏  举报  来源