简介
正则表达式为高级的文本匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。简单地说,正则表达式(regex)是一些由字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一系列有相似特征的字符串。
Python通过标准库re模块来支持正则表达式。其中re模块常用的函数有:complie()、match()、search()、findall()、split()等。
正则表达式中常见的特殊符号和字符
常用符号如下表:
表示法 | 描述 | 示例 |
---|---|---|
literal | 匹配文本字符串的字面值literal | geek |
re1|re2 | 匹配re1或re2 | geek | hacker |
. | 匹配任何字符(\n除外) | g.b |
^ | 匹配字符串的起始部分 | ^Dear |
$ | 匹配字符串的末尾部分 | love$ |
* | 匹配0次或者多次前面出现的正则表达式 | money* |
+ | 匹配1次或者多次前面出现的正则表达式 | [a-z]+.com |
? | 匹配0次或1次前面出现的正则表达式 | goo? |
{N} | 匹配N次前面出现的正则表达式 | [0-9]{3} |
{M,N} | 匹配M~N次前面出现的正则表达式 | [5-9]{5,9} |
[…] | (字符集)匹配来自字符集中的单一字符 | [aeiou] |
[…x-y…] | 匹配x~y范围中的任一单一字符 | [0-9] 、[a-zA-z] |
[^…] | 不匹配字符集中任一字符 | [^0-9]、[^a-zA-Z] |
(*|+|?)|{})? | 用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、+、?、{}) | .*?[a-z] |
(…) | 匹配封闭的正则表达式,然后另存为子组 | ([0-9]{3})?[a-z] |
特殊字符如下表:
表示法 | 描述 | 示例 |
---|---|---|
\d | 匹配任何十进制数字 | data\d+.txt |
\w | 匹配任何字母数字字符 | [a-z]\w+ |
\s | 匹配任何空格字符 | of\sthe |
\b | 匹配任何单词边界 | \bthe\b |
\N | 匹配已经保存的子组 | price:\16 |
\ | 逐字匹配任何特殊字符(转义) | \.、\* |
\A(\Z) | 匹配字符串的起始(结束) | \ADear love\Z |
Python 中的正则表达式
Python使用re模块来支持正则表达式。re模块支持更强大而且更通用的Perl风格的正则表达式该模块允许多个线程共享一个已编译的正则表达式对象,也支持命名子组。
常见的正则表达式属性
1.仅仅是re模块函数:
函数/方法 | 描述 |
---|---|
compile(pattern,flags=0) | 使用任何可选的标记来编译正则表达式,然后返回一个正则表达式对象 |
2.re模块函数和正则表达式对象的方法:
函数/f方法 | 描述 |
---|---|
match(pattern,string,flags=0) | 从字符串开始进行匹配,成功返回匹配对象,失败返回None |
search(pattern,string,flags=0) | 对字符串进行搜索,匹配成功返回匹配对象,失败返回None |
findall(pattern,string[,flags=0]) | 查找字符串中所有(非重复)出现的正则表达式,返回一个匹配列表 |
finditer(pattern,string[,flags=0]) | 与findall函数相同,但是返回的是一个迭代器,对于每一次匹配,迭代器都返回一个迭代对象 |
split(pattern,string,max=0) | 根据正则表达式的模式分隔符,将字符串分割为一个列表,然后返回匹配成功的列表,模式最多匹配max次(默认匹配全部) |
sub(pattern,repl,string,count=0) | 使用repl替换字符串中所有正则表达式在字符串中出现的位置,除非定义count,否则就替换全部位置 |
purge() | 清除隐式编译的正则表达式 |
3.常用的匹配对象方法
函数方法 | 描述 |
---|---|
group(num=0) | 返回整个匹配对象,或者是编号为num的某个子组 |
groups(default=None) | 返回一个包含所有匹配子组的元组(如果没有成功匹配,返回一个空元组) |
groupdict(default=None) | 返回一个包含所有匹配的命名子组的字典,所有的子组名称作为字典的键(如果没有匹配成功,就返回一个空字典) |
4.常用的模块属性(用于大多数正则表达式函数的标记)
属性 | 描述 |
---|---|
re.I、re.IGNORECASE | 不区分大小写的匹配 |
re.L、re.LOCALE | 根据所使用的本地语言环境通过\w、\W、\b、\B、\s、\S实现匹配 |
re.M、re.MULTILINE | ^和$匹配目标字符串中行的起始和结尾,而不是整个字符串的起始和结尾 |
re.S、re.DOTALL | “.”通常匹配除了\n外的所有字符,这个标记的意思是“.”匹配全部字符,包括\n |
re.X、re.VERBOSE | 通过反斜杠转义,否则所有空格加上#(以及在该行中所有后续文字)都被忽略,除非在一个字符类中或者运行注释并提高可读性 |