Python正则表达式

Re简介

正则表达式(Regular Expression,RE,以下简称Re)通常用来检索、替换那些符合某个模式(规则)的文本,也就是说,RE是用来记录文本规则的代码。

总的来说,正则表达式是:

  • 通用的字符串表达框架
  • 简洁表达一组字符串的表达式
  • 针对字符串表达“简洁”和“特征”思想的工具
  • 判断字符串的特征归属

Re的使用

编程语言使用正则表达式时需要编译,将符合正则表达式语法的字符串转换成正则表达式特征,也就是说,编译是将一个符合正则表达式语法的字符串编译为正则表达式

我们用字符串的形式表示正则表达式,如字符串[a-z]是表示匹配a到z中的任意一个字母的Re的表示方法

Re的语法

Re的语法是核心部分,RE语法是由字符和操作符组成。

常用操作符:

操作符 描述 具体用例
. 表示除换行符\n以外的任何单个字符,如果要匹配’.’,则使用\.,其余字符同理
[] 字符集,对单个字符给出取值范围 例:[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
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。 例: n 匹配字符 n。\n 匹配换行符,而 \\ 匹配 \\(匹配 “(“。
{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_](包括下划线)

Re语法实例

正则表达式 匹配的字符串
P(Y|YT|YTH)?N ‘PN’、’PYN’、’PYTN’、’PYTHN’
PYTHON+ ‘PYTHON’、’PYTHONN’、’PYTHONNN’…
PY[TH]ON ‘PYTON’,’PYHON’
PY[^TH]?ON ‘PYON’、’PYaON’、’PYbON’…(不含T和H即可)
PY{0,3}N ‘PN’、’PYN’、’PYYN’、’PYYYN’
^[A-Za-z]+$ 由26个字母组成的字符串
^[A-Za-z0-9]+$ 由26个字母和数字组成的字符串
^-?\d+$ 整数形式的字符串
^[0-9]*[1-9][0-9]*$ 正整数形式的字符串
[1-9]\d{5} 中国境内邮政编码,6位
[\u4e00-\u9fa5] 匹配中文字符(UTF-8编码)
\d{3}-\d{8}|\d{4}-\d{7} 国内电话号码,如000-12345678

如果想要匹配ip地址,需要考虑如何表示取值范围在0-255,将其分为四部分,即0-99,100-199,200-249,250-255:

(([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])

上述正则表达式,每两个|之间的正则表达式表示一个范围内的数,比如[1-9]?\d表示0-99

Python的re库

python中的re库使用raw string(原生字符串类型)表示正则表达式,如原生字符串text写作r'text'

例如,r'[1-9]\d{5}'是用来匹配邮政编码的Re字符串形式

raw string 是指不包含转义符的字符串,即\不被认为是转义符
也可以使用string类型,但是更繁琐,不建议使用

主要功能函数

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

函数的具体参数使用,详见官方文档,以re.search()函数举例:

1
2
3
re.search(pattern, string, flags=0)
# 其中pattern是Re的字符串,string是待匹配的字符串
# flags是Re使用时的控制标记,用于控制Re的匹配方式,如是否区分大小写等

使用方法

  • 函数式用法,一次性操作:

    1
    rst = re.search(r'[1-9]\d{5}', 'BIT 100081')
  • 面向对象用法,编译后的多次操作

    1
    2
    pat = re.compile(r'[1-9]\d{5}')
    rst = pat.search('BIT 100081')

    pat = re.compile(pattern, flags=0)是编译函数,将Re的字符串形式编译为Re对象

    生成的结果pat才是正则表达式,参数pattern只是正则表达式的字符串表示方法

Match对象

match对象是re函数的一种返回值对象,其有很多属性。

属性

代码 含义
match.string 待匹配的文本
match.re 匹配时使用的正则表达式
match.pos 正则表达式搜索文本的开始位置
match.endpos 正则表达式搜索文本的结束位置

方法

代码 含义
match.group(0) 返回匹配后的字符串
match.start() 返回匹配字符串在原始字符串的开始位置
match.end() 返回匹配字符串在原始字符串的结束位置
match.span() 返回(start(),end()),即开始和结束位置

贪婪匹配和最小匹配

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

若想得到最小匹配,则需要对以下操作符扩展,即在引起贪婪匹配的操作符后加?:

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