正则表达式基本规则
符号 | 含义 | 样例 |
---|---|---|
\d | 代表一个数字字符 | r'\d\d\d' :(表示要求匹配三个连续的数字字符) |
\D | 代表一个非数字字符 | r'\D\D\D' :(表示要求匹配三个连续的非数字字符) |
\w | 代表一个数字、字母或下划线字符(可以理解成组成单词的字符) | r'\w\w\w' :(表示要求匹配三个连续的单词字符) |
\W | 代表一个除数字、字母、下划线外的任何字符 | ('!@#' 就是一个符合r'\W\W\W' 的匹配项) |
\s | 代表一个空格符或制表符或换行符 | 略 |
\S | 代表一个除空格符、制表符、换行符外的任何字符 | 略 |
() | 分组 | r'(\d\d\d)-(\d\d\d\d)' :(表示分成两组进行匹配,第一组是三个数字字符,第二组是四个数字字符) |
? | 代表其前面的序列可以出现0次或1次 | r'Hello(Wo)?rld' :(表示匹配Hello,然后wo可以没有也可以有一组,即Hellorld和HelloWorld都满足要求) |
* | 代表其前面的序列可以出现0次或多次 | r'Hello(Wo)*rld' :(表示中间的wo可以没有也可以有任意组,即Hellorld、HelloWorld、HelloWoWo…rld都满足要求) |
+ | 代表其前面的序列至少出现1次 | r'Hello(Wo)+rld' :(表示匹配Hello,然后wo至少要有一次,即HelloWorld、HelloWo…World都满足要求,而Hellorld不满足) |
| | 代表两边的模式都可以 | r'Hello (Hi|HI|hi)' :(表示Hello Hi、Hello HI、Hello hi都满足匹配要求) |
{n,m} | 其前面的序列匹配n~m次 | r'Hello(Wo){3,5}rld' :(表示中间的Wo出现3,4,5次都是满足匹配要求的,只有"n,“表示0~m,z只有”,m"表示上不封顶,只有一个数字“n”,表示只能匹配n次) |
[] | 分类字符。表示用方括号内的字符匹配当前位置的一个字符 | r'\w{3}[abc123]' :(表示,其前面序列有三个字母、数字、下划线字符,且只能由"abc123 "这6个字符组成) |
- | 在放括号中使用,表示字符的范围 | r'123[a-zA-Z]' :(表示,123后面的字符只能是英文字母。方括号内的字符不用转义) |
^ | 在放括号中使用时,表示除方括号内分类字符意外的其他所有字符 | r'123[^a-zA-Z]' :(表示,123后面不能是英文字母。方括号内的字符不用转义) |
^ | 头匹配。在正则表达式的开始处使用,表示匹配必须发生在待查找文本的开始处 | r'^Hello' :(表示,字符串必须以Hello开头。可以与"$"一起使用) |
$ | 尾匹配。在正则表达式的最后处使用,表示匹配必须发生在待查找文本的结尾处 | r'\d+$' :(表示,字符串必须以至少一个数字结尾。可以与"^"一起使用) |
. | 通配符。可以表示除换行外的所有字符,但只能匹配一个 | r'.at' :(表示,at的前面可以是任意字符,即以at结尾的三字符组合) |
.* | 表示所有文本。贪心模式 | r'aaa(.*)bbb' :(表示由aaa开头,bbb结尾,中间是任意数量任意字符的序列。注意这个例子中并不要求整个待查序列是以aaa开头,bbb结尾的。) |
.*? | 表示所有文本。非贪心模式 | r'^aaa(.*)bbb$' :(表示由aaa开头,bbb结尾,中间是任意数量任意字符的序列。与上面的例子不同,这个例子中要求整个待查序列是以aaa开头,bbb结尾) |
re包基本正则函数与用法
需要导入re包:
import re
函数名 | 返回类型 | 参数 | 样例 |
---|---|---|---|
re.compile(regStr) | Regex对象 | 参数1:字符串形式的正则表达式(建议使用原始字符串) | regex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') |
re.compile(regStr,参数2) | Regex对象 | 参数2常用方法见文章最后注意事项 | regex = re.compile(r'.*',re.DOTALL) |
regex.search() | Match对象 | 待查找的字符串 | match = regex.search(r'fdhsakhfkd111-222-3333') |
match.group() | 实际匹配的字符串 | 0或无参:(返回整个匹配字符串); 其他:返回数字表示的匹配部分。 | match.group() |
match.groups() | 所有分组的元组 | 无 | 同上 |
regex.findall() | 所有匹配字符串的列表(表达式有分组时返回分组的元组列表) | 待查找的字符串 | strList = regex.findall() |
样例程序:
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('My number is 415-555-4242.')
mo.group(1)
mo.group(2)
mo.group(0)
mo.group()
mo.groups()
样例输出:
‘415’
‘555-4242’
‘415-555-4242’
‘415-555-4242’
(‘415’,‘555-4242’)
注意事项
1、贪心匹配和非贪心匹配
- Python 的正则表达式默认是“贪心” 的, 这表示在有二义的情况下,它们会尽
可能匹配最长的字符串。花括号的“非贪心” 版本匹配尽可能最短的字符串,即在
结束的花括号后跟着一个问号。
样例程序:
>>> greedyHaRegex = re.compile(r'(Ha){3,5}') #贪心版本返回最长匹配
>>> mo1 = greedyHaRegex.search('HaHaHaHaHa')
>>> mo1.group()
'HaHaHaHaHa'
>>> nongreedyHaRegex = re.compile(r'(Ha){3,5}?') #非贪心版本返回最短匹配
>>> mo2 = nongreedyHaRegex.search('HaHaHaHaHa')
>>> mo2.group()
'HaHaHa'
2、re.compile(regStr,参数2)中,参数2的常用值
参数 | 含义 | 样例 |
---|---|---|
re.DOTALL | 让通配符"."能匹配换行符 | re.compile(r".*",re.DOTALL) :(能将换行符也匹配进去) |
re.I | 字符匹配时忽略大小写 | re.compile(r"hello",re.I) :(只要是hello,不管怎么样的大小写都匹配) |
re.IGNORECASE | 同re.I | 略 |
re.VERBOSE | 忽略正则表达式字符串(即regStr)中的空白和注释,以便让正则表达式可以换行 | 见下面样例程序 |
样例程序:
regex = re.compile(r'''(
(\d{3}|\(\d{3}\))? # area code
(\s|-|\.)? # separator
\d{3} # first 3 digits
(\s|-|\.) # separator
\d{4} # last 4 digits
(\s*(ext|x|ext.)\s*\d{2,5})? # extension
)''', re.VERBOSE) #re.VERCASE使程序忽略参数regStr中的空格和注释
可以使用“|”将2个或3个参数同时使用,例如:
regex = re.compile('foo', re.IGNORECASE | re.DOTALL)
regex = re.compile('foo', re.IGNORECASE | re.DOTALL | re.VERBOSE)