ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
Regular Expression、regex或regexp,(缩写为RE) 是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。 计算机里处理文本和数据是非常重要的事情。 ### 一般匹配规则:[¶](http://uliweb.clkg.org/tutorial/view_chapter/192#title_0-0-1) 1 字符串匹配 "abcd" 这种是没有特殊规则,就是完全按照 字符去匹配。 例如:"hello,abcd" 可以匹配。 "hello,abc" 匹配不上。 ~~~ >>> import re >>> re.search("abcd","hello,abcd") <_sre.SRE_Match object at 0x994e2c0> >>> re.search("abcd","hello,abdc") ~~~ 2 选择匹配 gray|grey ,“gray” 和"grey " 都能匹配上。 或者用 gr(a|e)y 规则来匹配后面2个单词 "gray","grey"。 ~~~ >>> print re.search("gray|grey","gray") <_sre.SRE_Match object at 0x994e2c0> >>> print re.search("gray|grey","grey") <_sre.SRE_Match object at 0x994e2c0> >>> print re.search("gray|grey","grcy") None >>> print re.search("gr(a|e)y","gray") <_sre.SRE_Match object at 0xb77268a0> ~~~ 3 数量限定 ~~~ ‘+’ 加号代表前面的字符必须至少出现一次。(1次、或多次)。例如,“goo+gle”可以匹配google、gooogle、goooogle等; ? 问号代表前面的字符最多只可以出现一次。(0次、或1次)。例如,“colou?r”可以匹配color或者colour; ‘*’ 星号代表前面的字符可以不出现,也可以出现一次或者多次。(0次、或1次、或多次)。例如,“0*42” 可以匹配42、042、0042、00042等。 ~~~ ~~~ >>> re.search("goo+gle","google") <_sre.SRE_Match object at 0xb7717e20> >>> re.search("goo+gle", "gogle") >>> re.search("goo+gle", "goooogle") <_sre.SRE_Match object at 0x994e2c0> ~~~ “?” 例子 ~~~ >>> re.search("colou?r","color") <_sre.SRE_Match object at 0xb7717e20> >>> re.search("colou?r","colour") <_sre.SRE_Match object at 0x994e2c0> >>> re.search("colou?r","colouur") >>> #对比 "+" >>> re.search("colou+r","colouur") <_sre.SRE_Match object at 0xb7717e20> >>> re.search("colou+r","color") ~~~ “*” 例子: ~~~ >>> re.search("goo*gle","google") <_sre.SRE_Match object at 0xb7717e20> >>> re.search("goo*gle","gooogle") <_sre.SRE_Match object at 0x994e2c0> ~~~ 4 [...] 括号里面包含的任意字符 b[aeou]d 匹配"bad","bed","bod","bud" ~~~ >>> re.search("b[aeoud]d","bad") <_sre.SRE_Match object at 0x994e2c0> >>> re.search("b[aeoud]d","bed") <_sre.SRE_Match object at 0xb7717e20> >>> re.search("b[aeoud]d","bud") <_sre.SRE_Match object at 0x994e2c0> >>> re.search("b[aeoud]d","bcd") >>> re.search("b[aeoud]d","baed") ~~~ 匹配 [0-9],[0-9a-z] ~~~ >>> re.search('b[0-9a-z]d',"b12d") >>> re.search('b[0-9a-z]d',"b1d") <_sre.SRE_Match object at 0xb7717e20> >>> re.search('b[0-9a-z]d',"bad") <_sre.SRE_Match object at 0x994e2c0> ~~~ 5 多字符匹配 {n} [0-9]{3} : []以内的字母、数字在后面字符串中出现的次数。 “hd543”,符合规则。 "hello32rew",不符合规则。 ~~~ >>> re.search("[0-9]{3}","hd23") >>> re.search("[0-9]{3}","hd232") <_sre.SRE_Match object at 0x92ec2c0> >>> re.search("[0-9]{3}","hd234") <_sre.SRE_Match object at 0xb77bee20> >>> >>> re.search("[0-9]{4}","hd234") >>> re.search("[0-9d]{4}","hd234") <_sre.SRE_Match object at 0x92ec2c0> ~~~ 6\. []{m,n}, 按照[]内规则匹配 m---n之间个数,m必须小于n。 7 "." 匹配任何1个字符。 ~~~ >>> import re >>> re.search('b.b',"beb") <_sre.SRE_Match object at 0xb7280170> >>> re.search('b.b',"bab") <_sre.SRE_Match object at 0xb7280368> >>> re.search('b.b',"badb") >>> re.search('b..b',"badb") <_sre.SRE_Match object at 0xb7280170> >>> ~~~ 8 “^” 匹配字符串的开始 ~~~ >>> re.search('^bad',"badb") <_sre.SRE_Match object at 0xb7280368> >>> re.search('^ad',"badb") >>> re.search('^.ad',"badb") <_sre.SRE_Match object at 0xb7280170> >>> re.search('^..ad',"badb") >>> ~~~ 9 "$" 匹配字符串的结尾 ~~~ >>> re.search('adb$',"badb") <_sre.SRE_Match object at 0xb7280170> >>> re.search('.db$',"badb") <_sre.SRE_Match object at 0xb7280368> ~~~ 10 ~~~ '\d' 匹配数字 ‘\D' 匹配非数字 ~~~ ~~~ >>> re.search('\d',"badec3b2v432") <_sre.SRE_Match object at 0xb7280368> >>> re.search('\D',"badec3b2v432") <_sre.SRE_Match object at 0xb7280170> >>> ~~~ 11 ~~~ '\w' 匹配任意数字和字母 '\W' 非数字和字母 ~~~ 12 ~~~ '\s' 匹配任意空白字符,相当于 [ \t\n\r\f\v] \S 匹配任意非空白字符,相当于 [^ \t\n\r\f\v] ~~~ ### 使用方法[¶](http://uliweb.clkg.org/tutorial/view_chapter/192#title_0-0-2) A) ~~~ compiled_pattern = re.compile(pattern) result = compiled_pattern.match(string) ~~~ B) ~~~ result = re.match(pattern, string) ~~~ pattern,就是上面提到的规则。 除了match,以为还有几个函数,我们一起做说明: match() 函数只在字符串的开始位置尝试匹配正则表达式,也就是只报告从位置 0 开始的匹配情况。 search() 函数是扫描整个字符串来查找匹配。如果想要搜索整个字符串来寻找匹配,应当用 search()。 但search 返回第一个匹配的字符串。 split() 将字符串按照规则分成list。如果按照规则里面找不到,就不分割,返回原字符串。 ~~~ >>> re.split(":","test:test1:test2") ['test', 'test1', 'test2'] ~~~ findall() 函数搜索整个字符串,返回所有匹配项。返回一个list。 sub() 函数 查找并替换 ~~~ >>> re.sub("one","num","one world, on dream",1) 'num world, on dream' >>> re.sub("one","num","one world, one dream",1) 'num world, one dream' >>> re.sub("one","num","one world, one dream",2) 'num world, num dream' >>> ~~~ 可以: ~~~ >>> p = re.compile( '(one|two|three)') >>> p.sub( 'num', 'one word two words three words') 'num word num words num words' ~~~ 匹配网址的实例: ~~~ #coding=utf-8 import re urls=r'fdsa<a class="pic" href= "http://www.jeapedu.com ">... </a> ' s = re.findall("<a.*href.*>",urls) print s ~~~ 非贪婪匹配 + 后结束标记 ~~~ all_buf = re.findall(r'<a.*?href.*?=(.*?)[> ]',buf) for n in all_buf: print n ~~~ 简单匹配 @ 后面的用户正则 ~~~ #s = "@fdsa;1232" s = "fdsfds@fdsa你好.1, 232" a = re.findall("""@(.*?)(?=[;,| '".?])""",s) print a[0] ~~~ 如果@后面没有任何特殊符号,就结束了匹配方法,加了$: ~~~ >>> a= re.compile("@(.*?)(?=[ ,'$]|$)") >>> print a.findall("@sina @abd, @fds") ~~~