Python的正则表达式支持
re模块所包含的全部属性和函数:
- re.compile(pattern,flags=0):该函数用于将正则表达式字符串编译成_sre.SRE_Pattern对象,该对象代表了正则表达式编译之后在内存中的对象,可以缓存并复用正则表达式字符串;
- re.match(pattern,string,flags=0):尝试从字符串的开始位置来匹配正则表达式,如果开始位置匹配不成功,match()函数就返回None。其中pattern参数代表正则表达式,string代表被匹配的字符串,flags代表正则表达式的匹配旗标;
- re.search(pattern,string,flags=0):扫描整个字符串,并返回字符串中第一处匹配pattern的匹配对象;
- re.findall(pattern,string,flags=0):扫描整个字符串,并返回字符串中所有匹配pattern的子串组成的列表;
- re.finditer(pattern,string,flags=0):扫描整个字符串,并返回字符串中所有匹配pattern的子串组成的迭代器;
- re.fullmatch(pattern,string,flags=0):该函数要求整个字符串能匹配pattern,如果匹配则返回包含匹配信息的_sre.SRE_Match对象;否则返回None;
- re.sub(pattern,repl,string,count=0,flags=0):该函数用于将string字符串中所有匹配pattern的内容替换成repl;repl是被替换的字符串,也可以是一个函数;count参数控制最多替换多少次,如果指定为0,则表示全部替换;
- re.split(pattern,string,maxsplit=0,flags=0):使用pattern对string进行分割,该函数返回分割得到的多个子串组成的列表,其中maxsplit参数控制最多分割几次。
- re.purge():清除正则表达式缓存
- re.escape(pattern):对模式中除ASCII字符、数值、下画线之外的其他字符进行转义
re模块中_sre.SRE_Match对象包含以下方法或属性:
- match.group([group1,…]):获取该匹配对象中指定组所匹配的字符串
- match.__getitem __(g):这是match.group(g)的简化写法
- match.groups(default=None):返回match对象中所有组所匹配的字符串组成的元组
- match.groupdic(default=None):返回match对象中所有组所匹配的字符串组成的字典
- match.start([group]):获取该匹配对象中指定组所匹配的字符串的开始位置
- match.end([group]):获取该匹配对象中指定组所匹配的字符串的结束位置
- match.span([group]):获取该匹配对象中指定组所匹配的字符串的开始位置和结束位置
正则表达式旗标
Python支持的正则表达式旗标都使用该模块中的属性来代替:
- re.A或re.ASCII:该旗标控制\w,\W,\b,\B,\d,\D,\s和\S只匹配ASCII字符,而不匹配所有的Unicode字符
- re.DEBUG:显示编译正则表达式的debug信息
- re.I或re.IGNORECASE:使用正则表达式匹配时不区分大小写
- re.L或re.LOCALE:根据当前区域设置使用正则表达式匹配时不区分大小写
- re.M或re.MULTILINE:多行模式的旗标
- re.S或s.DOTALL:让点(.)能匹配包括换行符在内的所有字符
- re.U或re.Unicode:该旗标控制\w,\W,\b,\B,\d,\D,\s和\S能匹配所有的Unicode字符
- re.X或re.VERBOSE:通过该旗标允许分行写正则表达式
创建正则表达式
正则表达式就是一个用于匹配字符串的模板,它可以匹配一批字符串,所以创建正则表达式就是创建一个特殊的字符串。
正则表达式所支持的合法字符
字符 | 解释 |
---|---|
x | 字符x |
\uhhhh | 十六进制值0xhhhh所表示的Unicode字符 |
\t | 制表符 |
\n | 新行符 |
\r | 回车符 |
\f | 换页符 |
\a | 报警符 |
\e | Escape符 |
\cx | x对应的控制符 |
正则表达式中的特殊字符
特殊字符 | 说明 |
---|---|
$ | 匹配一行的结尾,要匹配$字符本身,请使用$ |
^ | 匹配一行的开头,要匹配^字符本身,请使用^ |
() | 标记子表达式的开始位置和结束位置,要匹配这些字符,请使用(和) |
[] | 用于确定中括号表达式的开始位置和结束位置,要匹配这些字符,请使用[和] |
{} | 用于标记前面子表达式的出现频度,要匹配这些字符,请使用{和} |
* | 指定前面子表达式可以出现0次或多次,要匹配字符本身,请使用\ |
+ | 指定前面子表达式可以出现一次或多次,要匹配+字符本身,请使用+ |
? | 指定前面子表达式可以出现0次或一次,要匹配?字符本身,请使用? |
. | 匹配除换行符\n之外的任意单个字符,要匹配.字符本身,请使用. |
\ | 用于转义下一个字符,要匹配\字符,请使用\ |
正则表达式中,通配符是可以匹配多个字符的特殊字符,称为“预定义字符”。
正则表达式所支持的预定义字符
预定义字符 | 说明 |
---|---|
. | 默认可匹配除换行符之外的任意字符 |
\d | 匹配0~9的所有数字 |
\D | 匹配非数字 |
\s | 匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等 |
\S | 匹配所有的非空白字符 |
\w | 匹配所有的单词字符,报警0~9的数字,26个英文字母和下画线 |
\W | 匹配所有的非单词字符 |
方括号表达式
方括号表达式 | 说明 |
---|---|
表示枚举 | 例如[abc],表示a、b、c其中任意一个字符 |
表示范围 | 例如[a-f],表示a~f范围内的任意字符 |
表示求否:^ | 例如[^abc],表示非a、b、c的任意字符 |
边界匹配符
边界匹配符 | 说明 |
---|---|
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词的边界,即只能匹配单词前后的空白 |
\B | 非单词的边界,即只能匹配不在单词前后的空白 |
\A | 只能匹配字符串的开头 |
\Z | 只能匹配字符串的结尾 |
子表达式
正则表达式支持圆括号表达式,用于将多个表达式组成一个子表达式,在圆括号中可以使用或运算符(|),子表达式支持如下用法:
- (exp):匹配exp表达式并捕获一个自动命名的组,后面可通过"\1"引用第一个捕获组所匹配的子串,通过"\2"引用第二个捕获组所匹配的子串…以此类推
- (?Pexp):匹配exp表达式并捕获成命名组,该组名字为name,后面可通过(?P=name)来引用前面捕获的组
- (?P=name):引用name命名组所匹配的子串
- (?:exp):匹配exp表达式并且不捕获
- (?<=exp):括号中的子模式必须出现在匹配内容的左侧,但exp不作为匹配的一部分
- (?=exp):括号中的子模式必须出现在匹配内容的右侧,但exp不作为匹配的一部分
- (?<!exp):括号中的子模式必须不出现在匹配内容的左侧,但exp不作为匹配的一部分
- (?!exp):括号中的子模式必须不出现在匹配内容的右侧,但exp不作为匹配的一部分
- (?#comment):注释组
- (?aiLmsux):旗标组,用于为整个正则表达式添加行内旗标
- (?imsx-imsx:exp):只对当前组起作用的旗标
贪婪模式与勉强模式
- *:限定前面的子表达式可出现0~N次
- +:限定前面的子表达式可出现1~N次
- ?:限定前面的子表达式出现0~1次
- {n,m}:n和m均为非负整数,其中n≤m,限定前面的子表达式出现n~m次
- {n,}:n是一个非负整数,限定前面的子表达式至少出n次
- {,m}:m是一个非负整数,限定前面的子表达式至多出现m次
- {n}:n是一个非负整数,限定前面的子表达式必须出现n次