【正则表达式】
由一些特定字符及其组合所组成的字符串表达式,用于对目标字符串进行过滤。
【正则表达式的常见基本符号】
基本符号 | 含义 | 解释 |
---|---|---|
d | 数字 | D为非数字 |
w | 单词字符(大小写字母或数字) | W为非单词字符 |
. | 单个字符 | 代表除换行符以外的任意单个字符。例如‘a.c’可以代表‘abc’、‘acc’,但不能代表‘abbc’ |
? | 多个字符(非贪婪模式) | 匹配前一个字符0次或1次 |
* | 多个字符 | 匹配前一个字符0次或无数次 |
+ | 多个字符 | 匹配前一个字符1次或无数次 |
| | 或 | 分隔字符之间“或”的关系,例如‘[P|p]ython’能匹配出‘Python’或‘python’ |
^ | 开始 | 引导字符串开始的特征 |
$ | 结尾 | 引导字符串结尾的特征 |
\ | 转义 | 为其后面的符号转义,但为避免与Python字符串本身的转移相混淆,建议正则表达式以r前缀统一转义。例如‘\d’可以表示为r‘d’ |
[] | 界定单个字符 | |
() | 界定一个整体 | |
{} | 重复次数 |
【精确匹配】
- 数字和字符:用 '\d' 可以匹配一个数字,用 '\w' 可以匹配一个字符(包括数字)。例如:'11\d' 可以匹配 '114',但不能匹配 '11A' ;'\d\d\d' 可以匹配 '021' 但不能匹配 'abc' ;'\w\w\d' 可以匹配 'mp4' 也可以匹配 '163' 。
- 任意单个字符:用 '.' 可以匹配任意单个字符。例如 'py.' 可以匹配 'py2'、'py!' 、'py@' 或 'py\' 。
- 多个字符:用 '*' 表示任意个字符(包括0个),用 '+' 表示至少一个字符,用'?'表示0个或1个字符,用 '{n}' 表示n个字符,用 '{m,n}' 表示n-m个字符,例如,有正则表达式 '\d{3}\s+\d{3,8}' 中,'\d{3}' 表示匹配三个数字, '\s+' 代表匹配一个或无数个空格(包括制表位空格),'\d{3,8}' 代表3~8位数字。这样,该表达式就可以匹配带区号的以任意个空格隔开的电话号码。
- 字符范围:用 '[]' 表示字符范围,一组 '[]' 只能表示一个字符,例如,'[0-9a-zA-Z\_]'可以匹配1个数字、字母或下划线;'P|y' 也是用来表示字符范围,可以匹配成 'P' 或 'p'。
- 开头和结尾:用 '^' 引导字符串开头,例如 '^\d' 表示必须以数字开头;用 '$' 指示字符串结尾,例如 '\d$' 表示必须以数字结尾。
- 特使字符:特殊字符通常指非字母、非数字字符。例如,换行符 '\n'、回车符 '\r'、空白符 '\s'、制表位符 '\t' 等。 为避免与语法表达式中符号的歧义,要用 '\' 转义或加 r 前缀统一转义。例如常见的用 '-' 隔开区号的电话号码,可用正则表达式 '\d{3}\-\d{3,8}' 或 r'd{3}-d{3,8}' 匹配。
- 汉字:匹配汉字的正则表达式为 '\u4e00-\u9fa5' 。在支持Unicode编码的系统中也可用汉字直接精准匹配
【贪婪匹配】
这是一种尽可能多地匹配字符地匹配思想,例如:'[0-9A-Za-z][0-9A-Za-z]*' 可以匹配由字母或下划线开头,与任意个数字、字母或下划线组成字符串(即Python的变量命名规则)。贪婪匹配时正则表达式默认的匹配方式,但在实际应用中有时也不能满足精准匹配的需求。用 '?' 可将前面的字符匹配从贪婪匹配转变为精准匹配,即尽可能减少重复匹配, '{m,n}?' 表示对前一个字符重复 m~n 次,并且尽可能少地重复。 例如在匹配字符串 'aaaaaa' 时, 'a{2,4}' 取上限可匹配 'aaaa',但 'a{2,4}?' 取下限只匹配 'aa'。
【替换】
用re库中地sub()和subn()函数,可以将正则表达式所匹配的字符串内容替换成指定字符串内容,并返回替换后的字符串。这两个函数用法一样,只是sub()返回的是替换后的新字符串,而subn()是以宇宙女足类型返回新字符串和替换次数。通式如下:
re.sub(pattern, replace_str, sourse_str[, count, flags])
re.subn(pattern, replace_str, sourse_str[, count, flags])
其中,replace_str 和 sourse_str分别代表拟替换字符串和源字符串,体验代码如下:
import re
pattern = re.compile('[\d]{3}')
sourse_str = '1234abcd123def2222hijk'
print(p.sub('xxx', sourse_str))
print(p.subn('xxx', sourse_str))
运行结果为:
xxx4abcdxxxdefxxx2hijk
('xxx4abcdxxxdefxxx2hijk', 3)