#\d(digit):匹配所有的数字 >>> re.match("\d","1abcd") <_sre.SRE_Match object; span=(0, 1), match='1'> >>> re.match("\\d","1abcd") <_sre.SRE_Match object; span=(0, 1), match='1'> >>> re.match(r"\d","1abcd")#加r转移符,写一个\,防止在文件里转译出错 <_sre.SRE_Match object; span=(0, 1), match='1'> >>> #search:从任意位置找到第一个,只返回第一个匹配到的,匹配不到返回None >>> re.search(r"\d","acb3ad") <_sre.SRE_Match object; span=(3, 4), match='3'> >>> >>> re.search(r"\d","acb3ad3l3sd4") <_sre.SRE_Match object; span=(3, 4), match='3'> >>> #findall:找到所有匹配的内容放到一个列表里,匹配不到时返回一个空的列表。 >>> re.findall(r"\d","a1b2c3") #匹配到所有的数字,放到一个列表里返回 ['1', '2', '3'] >>> >>> re.findall(r"\d","abc") #没匹配到返回一个空列表 [] >>> >>> result =re.findall(r"\d","a1b2c3") >>> result ['1', '2', '3'] >>> #因为match和search返回的是一个匹配对象,如果想查看匹配到的具体内容用时group() >>> result =re.match(r"\d","2bg") >>> result.group() '2' >>> result <_sre.SRE_Match object; span=(0, 1), match='2'> >>> result =re.search(r"\d","d2bg") >>> result <_sre.SRE_Match object; span=(1, 2), match='2'> #返回的是一个匹配对象 >>> result.group() #用group查看返回内容 '2' >>> result =re.search(r"\d","dbg") >>> result >>> result.group()#注意:没有匹配到内容时不能用group Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> #compile编译正则表达式,存到一个变量里方便复用 >>> pattern =re.compile(r"\d") >>> type(pattern) <class '_sre.SRE_Pattern'> >>> pattern.match("1ab") <_sre.SRE_Match object; span=(0, 1), match='1'> >>> pattern.search("dd1ab") <_sre.SRE_Match object; span=(2, 3), match='1'> >>> pattern.search("dd1ab").group() '1' >>> pattern.findall("344") ['3', '4', '4'] #练习: >>> s=input("请输入一些内容:") 请输入一些内容:I am ok! >>> if re.search(r"ok",s): #返回的是一个匹配对象,只要不是None就会认为是True,True就会执行if语句。 ... print(True) ... else: ... print(False) ... True >>> s=input("请输入一些内容:") 请输入一些内容:aaaaa >>> if re.search(r"ok",s): ... print(True) ... else: ... print(False) ... False \d\D:digit,匹配数字,非数字,大写表示取反 >>> re.search(r"\d","rw3e").group() #匹配数字 '3' >>> re.search(r"\D","rw3e").group() #匹配非数字 'r' >>> \w\W:word 匹配所有的大小写字母和数字,非字母非数字; [a-zA-Z_0-9] >>> re.search(r"\w"," a").group() 'a' >>> re.search(r"\w"," a").group() 'a' >>> re.search(r"\w"," 1").group() '1' >>> re.search(r"\W","_ 1").group() ' ' >>> re.search(r"\W","_").group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> re.search(r"\W","@").group() '@' >>> re.search(r"\W","!!@").group() '!' >>> re.findall(r"\w","中国") ['中', '国'] \s\S:space 匹配所有的空白,非空白 >>> re.search(r"\s","\t").group() '\t' >>> re.search(r"\s"," ").group() ' ' >>> re.search(r"\S"," ! ").group() '!' >>> re.search(r"\S"," %$2a ").group() '%' 量词:+,?,*,{},{m,n} +:表示匹配一个或多个内容 , 尽量多的配置, 正则表示式的贪婪性 >>> re.search(r"\d+","abc123 1").group() '123' >>> >>> re.search(r"\s+","\r\t\n 1").group() #+,正则的贪婪性,尽可能多的匹配 '\r\t\n ' >>> re.search(r"\s+?","\r\t\n 1").group() #?,抑制贪婪性,尽可能少的匹配 '\r' >>> re.findall(r"\d+","dbw2223ojds9jdkew1") ['2223', '9', '1'] >>> re.findall(r"\d+?","dbw2223ojds9jdkew1") # ['2', '2', '2', '3', '9', '1'] *:匹配0个或多个 >>> re.search(r"\d*","we333").group() #正则表达式都是从第一个字符开始匹配的,第一个“w”不满足\d匹配到了0次,符合\d*匹配0个,所以返回了 '' >>> re.search(r"\d","we333").group() '3' >>> re.search(r"\w*","ab123 1").group() #匹配到了多个 'ab123' {}:指定匹配次数 >>> re.search(r"\d{3}","12 123 34").group() '123' >>> re.search(r"\d{1,3}","12 123 34").group() #指定范围 '12' >>> re.search(r"\d{1,}","12 123 34 0").group() #后面不写范围,表示匹配大于等于1次的 '12' ?:表示匹配0次或一次 >>> re.search(r"\d?","123a").group() '1' >>> re.search(r"\d?","dd123a").group() #从开头匹配,字符串“d”不满足\d的数字匹配,也满足?匹配0次的规则,所以返回了 '' >>> >>> re.findall(r"\d?","ff2123a") #每一个字符都做了一个匹配,匹配不到返回空,匹配到了放回内容,放到一个列表里 ['', '', '2', '1', '2', '3', '', ''] >>> .匹配非空格、非回车之外的所有字符,匹配的是一个字符 >>> re.search(r"a.b","a1b").group() 'a1b' >>> 抑制贪婪性 >>> re.search(r"a.*b","a1 db 123b").group() #.表示匹配ab之间的一个字符,如a1b,加一个*(.*)表示匹配ab之间可以有0个或多个字符都成立,即匹配a和b之间的所有内容 'a1 db 123b' >>> re.search(r"a.*b","ab").group() 'ab' >>> re.search(r"a.*b","ab a1b a89 b").group() 'ab a1b a89 b' >>> re.search(r"a.*?b","a1 db 123b").group() #加个?抑制贪婪性 'a1 db' >>> 总结: match search findall re.complie group \d\D \w\W \s\S * + . ? {m,n} \w 匹配字母数字及下划线 \W 匹配f非字母数字下划线 \s 匹配任意空白字符,等价于[\t\n\r\f] \S 匹配任意非空字符 \d 匹配任意数字 \D 匹配任意非数字 \A 匹配字符串开始 \Z 匹配字符串结束,如果存在换行,只匹配换行前的结束字符串 \z 匹配字符串结束 \G 匹配最后匹配完成的位置 \n 匹配一个换行符 \t 匹配一个制表符 ^ 匹配字符串的开头 $ 匹配字符串的末尾 . 匹配任意字符,除了换行符,re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 [....] 用来表示一组字符,单独列出:[amk]匹配a,m或k [^...] 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符 * 匹配0个或多个的表达式 + 匹配1个或者多个的表达式 ? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 {n} 精确匹配n前面的表示 {m,m} 匹配n到m次由前面的正则表达式定义片段,贪婪模式 a|b 匹配a或者b () 匹配括号内的表达式,也表示一个组
python学习笔记之---正则表达式
正则:一些字符串,可以实现模糊的匹配
regular expression
常用的场景:爬虫、分析日志
#正则的包
>>> import re
#match:开头匹配,匹配到,返回一个匹配对象,否则返回None
>>> re.match("abc","abcd")
<_sre.SRE_Match object; span=(0, 3), match='abc'>#返回的是一个匹配对象,要想查看匹配的内容用group(),search也是
>>> result =re.match(r"\d","dbja1")
>>> type(result)
<class 'NoneType'> #没有匹配返回None
>>>