正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(Regular Expression,在代码中常简写为regex、regexp或RE) 。它是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。而Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
正则表达式语法 表示单字符 单字符:即表示一个单独的字符,比如匹配数字用\d,匹配非数字用\D。
除以下语法,也可以匹配指定的具体字符,可以是1个也可以是多个。
字符 功能说明. 匹配任意1个字符(除了\n)
[2a] 匹配[]中括号中列举的字符,如这里就是匹配2或者a这两个字符其中的一个
\d 匹配数字,即0-9
\D 匹配非数字
\s 匹配空白,即空格、tab键(tab键为两个空格)
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_(数字、字母、下划线)
\W 匹配非单词字符
实例如下,这里先说明一下findall(匹配规则,要匹配的字符串)这个方法是查找所有匹配的数据,以列表的形式返回,后面会在re模块进行详解:
import re # .:匹配任意1个字符 re1 = r'.' res1 = re.findall(re1, '\nj8?0\nbth\nihb') print(res1) # 运行结果:['j', '8', '?', '0', 'b', 't', 'h', 'i', 'h', 'b'] # []:匹配列举中的其中一个 re2 = r"[abc]" res2 = re.findall(re2, '1iugfiSHOIFUOFGIDHFGFD2345a6a78b99cc') print(res2) # 运行结果:['a', 'a', 'b', 'c', 'c'] # \d:匹配一个数字 re3 = r"\d" res3 = re.findall(re3, "dfghjkl32212dfghjk") print(res3) # 运行结果:['3', '2', '2', '1', '2'] # \D:匹配一个非数字 re4 = r"\D" res4 = re.findall(re4, "d212dk?\n$%3;]a") print(res4) # 运行结果:['d', 'd', 'k', '?', '\n', '$', '%', ';', ']', 'a'] # \s:匹配一个空白键或tab键(tab键实际就是两个空白键) re5 = r"\s" res5 = re.findall(re5,"a s d a 9999") print(res5) # 运行结果:[' ', ' ', ' ', ' ', ' '] # \S: 匹配非空白键 re6 = r"\S" res6 = re.findall(re6, "a s d a 9999") print(res6) # 运行结果:['a', 's', 'd', 'a', '9', '9', '9', '9'] # \w:匹配一个单词字符(数字、字母、下划线) re7 = r"\w" res7 = re.findall(re7, "ce12sd@#a as_#$") print(res7) # 运行结果:['c', 'e', '1', '2', 's', 'd', 'a', 'a', 's', '_'] # \W:匹配一个非单词字符(不是数字、字母、下划线) re8 = r"\W" res8 = re.findall(re8, "ce12sd@#a as_#$") print(res8) # 运行结果:['@', '#', ' ', '#', '$'] # 匹配指定字符 re9 = r"python" res9 = re.findall(re9, "cepy1thon12spython123@@python") print(res9) # 运行结果:['python', 'python'] 表示数量 如果要匹配某个字符多次,就可以在字符后面加上数量进行表示,具体规则如下:
字符 功能说明* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或无限次,即至少1次
? 匹配前一个字符出现0次或1次,即要么没有,要么只有1次
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次
实例如下:
import re # *:表示前一个字符出现0次以上(包括0次) re21 = r"\d*" # 这里匹配的规则,前一个字符是数字 res21 = re.findall(re21, "343aa1112df345g1h6699") # 如匹配到a时,属于符合0次,但因为没有值所以会为空 print(res21) # 运行结果:['343', '', '', '1112', '', '', '345', '', '1', '', '6699', ''] # ? : 表示0次或者一次 re22 = r"\d?" res22 = re.findall(re22, "3@43*a111") print(res22) # 运行结果:['3', '', '4', '3', '', '', '1', '1', '1', ''] # {m}:表示匹配一个字符m次 re23 = r"1[3456789]\d{9}" # 手机号:第1位为1,第2位匹配列举的其中1个数字,第3位开始是数字,且匹配9次 res23 = re.findall(re23,"sas13566778899fgh256912345678jkghj12788990000aaa113588889999") print(res23) # 运行结果:['13566778899', '13588889999'] # {m,}:表示匹配一个字符至少m次 re24 = r"\d{7,}" res24 = re.findall(re24, "sas12356fgh1234567jkghj12788990000aaa113588889999") print(res24) # 运行结果:['1234567', '12788990000', '113588889999'] # {m,n}:表示匹配一个字符出现m次到n次 re25 = r"\d{3,5}" res25 = re.findall(re25, "aaaaa123456ghj333yyy77iii88jj909768876") print(res25) # 运行结果:['12345', '333', '90976', '8876'] 匹配分组 字符 功能说明| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组