Python正则表达式与re模块介绍

Python中通过re模块实现了正则表达式的功能。re模块提供了一些根据正则表达式进行查找、替换、分隔字符串的函数。本文主要介绍正则表达式先关内容以及re模块中常用的函数和函数常用场景。

正则表达式基本语法

正则表达式就是使用预先定义好的特定字符以及这些特定字符的组成字符串的匹配表达式,然后利用表达式去匹配或提取字符串。因此,我们首先需要熟悉正则表达式中的特定字符以及它们的含义、用法。下面将正则表达式中的特殊字符分类介绍。

基本字符介绍

(1). 点号,表示匹配除换行"\n"外的任意1个字符。假设表达式:a.c,则匹配abc/a1c,不匹配ac。但是在python的re模块函数可以通过设置re.S标志让它也匹配换行符。

>>> import re
>>> re.findall(r'a.c','abc')
['abc']
>>> re.findall(r'a.c','ac')
[]
>>> re.findall(r'a.c','a\nc',re.S)
['a\nc']

(2)\ 转义字符,使后一个字符改变原来的含义。假设表达式为a\.c,则仅匹配a.c,不匹配abc、a1c等a与c之间非点号"."的字符串。在转义符"\"之后点号".失去了原来代表任意字符的含义。

>>> re.findall(r'a\.c','a.c')
['a.c']
>>> re.findall(r'a\.c','abc')
[]

(3)[...] 字符集,对应的位置可以是字符集中任意字符,字符集中的字符可以逐个列出,也可以给出范围,或者如果第1个字符是^表示取反。下面针对这几种情形逐一描述。

场景1:[...]字符集中的字符逐个列出。如[bcd]。假设正则表达式为a[bcd]e,则匹配abe、ade,但不匹配afe。实例如下:

>>> re.findall(r'a[bcd]e','abe')
['abe']
>>> re.findall(r'a[bcd]e','ade')
['ade']
>>> re.findall(r'a[bcd]e','afe')
[]

场景2:[...]字符集中的字符以范围给出。假设表达式为a[a-d]e,相当于a[abcd]e。则匹配abe、ade。

>>> re.findall(r'a[a-d]e','abe')
['abe']
>>> re.findall(r'a[a-d]e','ade')
['ade']

场景3:如果[...]字符集第一个字符是^,则表示取反。假设表达式为a[^abc]e,则匹配afe,不匹配abe、ace。

>>> re.findall(r'a[^abc]e','abe') # ^在中括号内表示取反的意思。所以a[^abc]e可以匹配afe、a1e,但不匹配abe、ace
[]
>>> re.findall(r'a[^abc]e','afe')
['afe']

那如果^字符不是在第一个字符呢,那它就仅仅表示一个普通的字符。假设表达式为a[a^bc]e,则匹配abe、a^e、ace,不匹配afe。

>>> re.findall(r'a[a^bc]e','abe')
['abe']
>>> re.findall(r'a[a^bc]e','a^e')
['a^e']
>>> re.findall(r'a[a^bc]e','afe')
[]

场景4:特殊字符在字符集[...]中都失去其原有的特殊含义。假设表达式为a[a.bc]e,则匹配abe、ace、a.e,不匹配afe

>>> re.findall(r'a[a.bc]e','a.e') #特殊符号"."在中括号内失去了原有的含义。
['a.e']
>>> re.findall(r'a[a.bc]e','afe')
[]

预定义字符集

(1)\d 表示1个数字,相当于[0-9]。假设表达式为a\dc,则匹配a1c,不匹配abc

>>> re.findall(r'a\dc','a1c')
['a1c']
>>> re.findall(r'a\dc','abc')
[]

(2)\D 表示1个非数字,相当于[^0-9]。假设表达式a\Dc,则匹配abc,不匹配a1c

>>> re.findall(r'a\dc','a1c')
['a1c']
>>> re.findall(r'a\dc','abc')
[]

(3)\s 表示1个空白字符,相当于[<空格>\t\r\n\f\v]。假设表达式为a\sc,则匹配a c,不匹配abc

>>> re.findall(r'a\sc','a c')
['a c']
>>> re.findall(r'a\sc','abc')
[]

(4)\S 表示1个非空白字符,相当于[^\s]。假设表达式为a\Sc,则匹配abc,不匹配a c

>>> re.findall(r'a\Sc','abc')
['abc']
>>> re.findall(r'a\Sc','a c')
[]

(5)\w 表示1个单词字符,相当于[a-zA-z0-9_]。假设表达式为a\wc,则匹配abc,不匹配a c

>>> re.findall(r'a\wc','abc')
['abc']
>>> re.findall(r'a\wc','a1c')
['a1c']
>>> re.findall(r'a\wc','a c')
[]

(6)\W 表示1个非单词字符,相当于[^\w]。假设表达式为a\Wc,则匹配a c,不匹配abc

>>> re.findall(r'a\Wc','a c')
['a c']
>>> re.findall(r'a\Wc','a!c')
['a!c']
>>> re.findall(r'a\Wc','a.c')
['a.c']
>>> re.findall(r'a\Wc','abc')
[]
>>> re.findall(r'a\Wc','a1c')
[]

数量词

(1)* 表示匹配前一个字符0~n次。假设表达式为abc*,则匹配ab、abc、abcc

>>> re.findall(r'abc*','ab')
['ab']
>>> re.findall(r'abc*','abc')
['abc']
>>> re.findall(r'abc*','abcc')
['abcc']

(2)+ 表示匹配前一个字符1~n次。假设表达式为abc+,则匹配abc、abccc,不匹配ab

>>> re.findall(r'abc+','abc')
['abc']
>>> re.findall(r'abc+','abcc')
['abcc']
>>> re.findall(r'abc+','ab')
[]

(3)? 表示匹配前一个字符0或1次。假设表达式为abc?,则匹配ab、abc

>>> re.findall(r'abc?','ab')
['ab']
>>> re.findall(r'abc?','abc')
['abc']

(4){m} 表示匹配前一个字符m次。假设表达式为abc{2},则匹配abcc,不匹配abc

>>> re.findall(r'abc{2}','abcc')
['abcc']
>>> re.findall(r'abc{2}','abc')
[]

(5){m,n} 表示匹配前一个字符m到n次。假设表达式为abc{2,3},则匹配abcc、abccc,不匹配abc

>>> re.findall(r'abc{2,3}','abcc')
['abcc']
>>> re.findall(r'abc{2,3}','abccc')
['abccc']
>>> re.findall(r'abc{2,3}','abc')
[]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5b6389b2e8fe863f47a46e799e783aac.html