0%

Python正则表达式

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文档

例如:

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

其中:

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

还有一种写法是这样的

1
2
3
4
5
6
7
>>> 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库默认采用贪婪匹配,即输出匹配长的子串

例如

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

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

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

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

还有一些其他的操作符

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