Python3 正则表达式


Python3 正则表达式

正则表达式(regular expression,也称为regex或regexp)是一种通用的文本模式匹配工具,可用于在任何文本中识别模式,并提取或替换这些模式。正则表达式特别适用于文本处理,如数据清洗、数据提取和数据验证等领域。

Python3 中的正则表达式模块是 re。该模块提供了一组函数和常量,可用于编译、匹配和处理正则表达式。

1.编译正则表达式

要使用正则表达式,需要先编译其模式。这可以通过 re.compile(pattern, flags=0) 实现。pattern是带有一个或多个转义序列的Python字符串,表示要匹配的模式。flags控制匹配的模式。例如,re.I表示忽略大小写,re.M表示使用多行模式。

2.匹配正则表达式

使用编译后的正则表达式对象的方法,如match()、search()和findall()等,可以在源文本中查找模式。

match()方法从字符串的开头位置开始匹配模式,并返回匹配对象。如果没有找到匹配项,则返回None。

search()方法在文本的任何位置查找模式。如果找到匹配项,则返回匹配对象。否则也返回None。

findall()方法返回源文本中所有匹配的字符串列表。

3.正则表达式模式语法

正则表达式是由特殊字符和普通字符组成的模式字符序列。特殊字符由一个反斜杠(\)后面跟着一个或多个字符组成。普通字符只是字符串中的任何字符,但可以被匹配的特殊字符来进行匹配。

3.1 特殊字符

简单案例:

\d 匹配任意数字,等价于[0-9]。

\D 匹配任意非数字字符。

\w 匹配字母或数字或下划线或汉字,等价于[A-Za-z0-9_\u4e00-\u9fa5]。

\W 匹配任意非字字母数字下划线或汉字。

\s 匹配任意空白字符,等价于[\t\n\r\f\v]。

\S 匹配任意非空白字符。

. 匹配除了换行符以外的任意字符。

^ 匹配字符串的开头。

$ 匹配字符串的结尾。

3.2 字符集

用[]表示。单个字符可以是任意普通字符或多个字符范围。例如,[1-9]表示1到9的任意数字,[a-zA-Z]表示任意大小写字母,[\u4e00-\u9fa5]表示任意汉字。

3.3 量词

量词指定前面的模式重复的次数。例如,+、*和?等。+表示前面的模式至少出现一次,*表示前面的模式出现零次或多次,? 表示前面的模式可以出现零次或一次,{n}表示前面的模式出现n次,{n,m}表示前面的模式出现n到m次。

3.4 分组

用()表示。可以将模式分为字符子集,并对子集应用量词。分组可用于捕获匹配项,也可用于非捕获分组。

例如,(abc)+表示匹配一个或多个 abc。

3.5 反向引用

在分组内使用\1、\2等表示对分组的反向引用。例如,(abc)\1表示匹配两个连续的 abc。

4.操作符

| 表示或操作符,用于在模式中分隔两个选择项。

() 表示分组操作符,用于将多个字符分组处理。

[] 表示字符集合,用于指定匹配一个字符的可能性。

^ 表示开始匹配文本的位置。

$ 表示结束匹配文本的位置。

. 表示匹配除换行符以外的任意字符。

  • 表示匹配前一个字符零次或者多次。
  • 表示匹配前一个字符一次或者多次。

? 表示匹配前一个字符零次或者一次。

{n} 表示匹配前一个字符n次。

{n,} 表示匹配前一个字符至少n次。

{n,m} 表示匹配前一个字符最少n次最多m次。

5.简单示例

匹配邮政编码:^[1-9]\d{5}$。

匹配IP地址: (([01]?\d?\d|2[0-4]\d|25[0-5]).){3}(([01]?\d?\d|2[0-4]\d|25[0-5]))。

匹配邮箱地址: ^([0-9a-zA-Z_]+)@([0-9a-zA-Z_]+).(com|cn)$。

6.总结

正则表达式是一种通用的文本匹配工具,Python3中的re模块提供了一组函数和常量,可用于编译、匹配和处理正则表达式。熟练掌握正则表达式模式语法是正则表达式的核心,常见匹配模式包括字符匹配、量词、反向引用等。在实际应用中,可以根据具体需求灵活运用正则表达式,例如匹配IP地址、手机号码等常用模式。