理解:
正则表达式用于搜索,替换,和解析字符串,是一种用于文本匹配的工具。
特别字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用\ +。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用\ [。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用\ ?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\’ 匹 配 “”,而 ‘\(’ 则匹配 “(”。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用\ ^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用\ {。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 \|。 |
\w | 匹配数字字母下划线 |
\W | 匹配不是数字,字母,下划线的字符 |
\s | 匹配空白字符 |
\S | 匹配非空白的字符 |
\d | 匹配数字 |
\D | 匹配非数字的字符 |
\b | 匹配单词开始和结束 |
\B | 匹配不是单词开始和结束的位置 |
[m] | 匹配单个字符 |
[m1m2…n] | 匹配多个字符 |
[m-n] | 匹配m到n区间内的数字字母 |
[^m] | 匹配除m以外的字符 |
注意:
匹配符[]可以匹配一个范围。
例如:【OK】将匹配含O或者含K的字符串;“【】”可以与\w,\s,\d等标记等价;【0-9a-zA-Z_】等价于\w;[^0-9]等价于\D.
^与【^m】中的“^”含义不同,后者表示“除了……”。
常用限定符 | 描述 |
---|---|
* | 匹配零次或多次 |
+ | 匹配一次或多次 |
? | 匹配一次或零次 |
{m} | 重复m次 |
{m,n} | 重复m到n次,n可以省略,表示m到任意次。 |
理解:利用{}可以控制操作字符次数。
-
对正则表达式进行嵌套使用分组“()”。例如对三位数字重复四次(\d\d\d){4}
版本不同,可能对应的数字不同,本人实验得重复x次,{}内的数字为x.
-
\d\d\d{n},注意两者区分,此处尽在第三处\b重复三次。
默认情况下,正则表达式匹配最长的字符串,如想匹配最短字符串,可在限定符后面添加“?”。待匹配文本:acaccaacaaccaccc 正则表达式:a*?c 共找到 9 处匹配: ac ac c aac aac c ac c c 注意匹配结果!!!
符号 描述 *? 匹配零次或多次且最短匹配 +? 匹配一次或多次且最短匹配 ?? 匹配一次或零次且最短匹配 {m,n}? 匹配m次且最短匹配 (?#…) 正则表达式中的注释 (?P…) 给分组名,name表示分组名称 (?P = name) 使用名为name的分组 后两者为Python中的用法。
使用sys.re模块处理正则表达式
函数 描述 findall(pattern,string,flags = 0) 根据pattern在string中匹配字符串。如果匹配成功,返回包含匹配结果的列表,否则返回空列表。当pattern中有分组时,返回包含多个元组的列表,每个元组对应一个分组。flags表示规则选项,规则选项用于辅助匹配。 sub(pattern,repl,string,count = 0) 根据指定的正则表达式替换原字符串中的子串。pattern是一个正则表达式,repl是用于替换的字符串,string是原字符串。若count = 0,则返回string中匹配的所有结果;若count > 0,则返回前count个匹配结果 subn(pattern,repl,string,count = 0) 作用同sub相同。返回一个二元的数组。第一个元素是替换结果,第二个元素是替换次数。 match(pattern,string,flags = 0) 根据pattern从string头部开始匹配结果,只返回第一次匹配成功的对象,否则返回None search(pattern,string,flags = 0) 根据pattern在string中匹配字符串,只返回第一次匹配成功的对象,若匹配失败,则返回None。 complie(pattern,flags = 0) 编译一个正则表达式,返回一个Pattern对象。 split(pattern,string,maxsplit = 0) 根据pattern分割string,maxsplit表示最大分割数。 escape(pattern) 匹配字符串中的特殊字符。 函数match(必须从字符串的第0个位置开始搜索,若果第0个索引位置的索引不匹配,match()的匹配就会失败。)
** RE模块的规则选项**选项 描述 I 或 IGNORECASE 忽略大小写 L或 LOCALE 字符集本地化,用于多语言环境 M 或MULTILINE 多行匹配,使用^ $,匹配除了string开始结束外,还匹配一行的开始和结束 S 或DOTALL 使用" . "匹配包括“\n”在内的所有字符。 X 或VERBOSE 忽略正则表达式中的空白,换行,以方便添加注释 U 或UNICODE “\B”,"\b","\w","\W","\d","\D","\s","\S"都将使用Unicode -
正则表达式中有三中间隔符——^,$,\b.^ 匹配字符串首部的子串;$ 匹配结束部分字符串;\b用于分割单词。
-
re模块中的sub()可以实现字符串的替换。
结果:
sub()先创建变量是sh的拷贝,在拷贝中替换字符串,不改变 变量sh的内容。
样例:
结果:
r标识后代表正则表示语句
空白字符有[\b],\f,\n,\r,\t,\v.
subn()相较于sub()多返回匹配后的替换次数。
据某些大神说\w为匹配汉字看编译环境。
pattern对象的属性及方法
若要使用同一规则匹配字符串,可以使用compile()函数进行预编译,complie函数返回一个pattern对象。
方法 | 描述 |
---|---|
Pattern | 获取当前使用的正则表达式 |
findall(string[, start[, end] ] ) | 查找所有符合pattern对象匹配条件的结果,返回一个包含匹配结果的列表。参数string表示待查找的源字符串,参数start表示搜索开始位置,参数end表示搜索结束的位置。 |
finditer(string[ , start [ , end ] ] ) | 返回一个包含匹配结果的地址 |
match(string[ , start[ , end] ] ) | 用法同re.match() |
search(string [ , start [ , end ] ] ) | 用法同re.search() |
样例:
结果:
函数compile()通常与match(),search(),group()一起使用。对含有分组的正则表达式解析。正则表达式的分组从左往右开始计数,第一个出现得圆括号标记为第一组,以此类推。0组用于储存整个正则表达式的结果。match()和search()将返回一个match对象。
属性或方法 | 描述 |
---|---|
Pos | 搜索开始的位置 |
Endpos | 搜索结束的位置 |
String | 搜索的字符串 |
Re | 当前使用正则表达式的对象 |
Lastindex | 最后匹配的组索引 |
Lastgruop | 最后匹配的组名 |
group(index = 0) | 某个分组的匹配结果。若index=0,则匹配整个表达式 |
groups() | 所有的分组的匹配结果,每个分组的匹配结果作为value的字典 |
Groupdict() | 返回组名作为key,每个分组的结果作为value的字典 |
start( [ group ] ) | 获取组的开始位置 |
end([group]) | 获取组的结束位置 |
span([group]) | 获取组的开始和结束位置 |
expand( [ template ] ) | 使用组的匹配结果来替换模板template中的内容,并把替换后的字符串返回 |
样例:
结果:
运算符优先级
运算符 | 描述 |
---|---|
\ | 转义符 |
(), (?: ), (?=), [] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
| | 替换,"或"操作字符具有高于替换运算符的优先级,使得"m |