re模块
一、简介
正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。
二、正则表达式中常用的字符含义
1、普通字符和11个元字符:
| 普通字符 |
匹配自身
|
abc
|
abc
|
|
.
|
匹配任意除换行符"\n"外的字符(在re.DOTALL 模式中也能匹配换行符,简写re.S) |
a.c
|
abc
|
|
\
|
转义字符,使后一个字符改变原来的意思
|
a\.c;a\\c
|
a.c;a\c
|
|
*
|
匹配前一个字符0或多次
|
abc*
|
ab;abccc
|
|
+
|
匹配前一个字符1次或无限次
|
abc+
|
abc;abccc
|
|
?
|
匹配一个字符0次或1次
|
abc?
|
ab;abc
|
|
^
|
匹配字符串开头。在多行模式中匹配每一行的开头 | ^abc |
abc
|
|
$
|
匹配字符串末尾,在多行模式中匹配每一行的末尾 | abc$ |
abc
|
| | |
或。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式 |
abc|def
|
abc
def
|
| {} | {m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次 |
ab{1,2}c
|
abc
abbc
|
|
[]
|
字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。 所有特殊字符在字符集中都失去其原有的特殊含义。用\反斜杠转义恢复特殊字符的特殊含义。 |
a[bcd]e
|
abe
ace
ade
|
|
()
|
被括起来的表达式将作为分组,从表达式左边开始没遇到一个分组的左括号“(”,编号+1. 分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。 |
(abc){2} a(123|456)c |
abcabc
a456c
|
2、预定义字符集表,可以写在字符集[...]中
|
\d |
\d匹配任何十进制数,它相当于类[0-9],\d+如果需要匹配一位或者多位数的数字时用 |
a\bc |
a1c |
|
\D |
\D匹配任何非数字字符,它相当于类[^0-9] |
a\Dc |
abc |
|
\s |
\s匹配任何空白字符,它相当于类[\t\n\r\f\v] |
a\sc |
a c |
|
\S |
\S匹配任何非空白字符,它相当于类[^\t\n\r\f\v] |
a\Sc |
abc |
|
\w |
\w匹配包括下划线在内任何字母数字字符,它相当于类[a-zA-Z0-9_] |
a\wc |
abc |
|
\W |
\W匹配非任何字母数字字符包括下划线在内,它相当于类[^a-zA-Z0-9_] |
a\Wc |
a c |
|
\A |
仅匹配字符串开头,同^ |
\Aabc |
abc |
|
\Z |
仅匹配字符串结尾,同$ |
abc\Z |
abc |
|
\b |
b匹配一个单词边界,也就是指单词和空格间的位置 |
\babc\b |
空格abc空格 |
|
\B |
[^\b] |
a\Bbc |
abc |
3、特殊分组用法表:只对正则函数返回对象的有用
|
(?P<name>) |
?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容, 在用groupdict()方法打印字符串 |
(?P<id>abc){2} |
abcabc |
|
(?P=name) |
引用别名为<name>的分组匹配到字符串 |
(?P<id>\d)abc(?P=id) |
1abc1 5abc5 |
|
\<number> |
引用编号为<number>的分组匹配到字符串 |
(\d)abc\1 |
1abc1 5abc5 |
4、正则匹配模式表
|
标志 |
含义 |
|
re.S(DOTALL) |
使.匹配包括换行在内的所有字符 |
|
re.I(IGNORECASE) |
使匹配对大小写不敏感 |
|
re.L(LOCALE) |
做本地化识别(locale-aware)匹配,法语等 |
|
re.M(MULTILINE) |
多行匹配,影响^和$ |
|
re.X(VERBOSE) |
该标志通过给予更灵活的格式以便将正则表达式写得更易于理解 |
|
re.U |
根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B |
注意1: 养成在正则表达式前加 r 的习惯,因为可以避免 \ 的影响
import re re.findall(r'a\nbc','a\nbc') ['a\nbc'] re.findall(r'a\\nbc','a\\nbc') ['a\\nbc'] re.findall(r'a\\\nbc','a\\\nbc') ['a\\\nbc']
注意2:
re.findall(r“a.*bc”,”a\nbc”,re.DOTALL) 和 re.findall(r“a(.*)bc”,”a\nbc”,re.DOTALL)的区别?
不分组时匹配的是全部,分组后匹配的是组内的内容,
参考:

浙公网安备 33010602011771号