2020627正则表达式

    技术2024-10-21  23

    import re(正则的包)

    #match 从字符串的开头位置匹配,从开头可以匹配到,就获得一个正则对象,

    匹配不到就返回None

    1.re.match(“正则表达式”,”目标字符串”),匹配成功会返回一个正则对象,,若失败则返回一个None,re.match("asd","1asdfghh").group()失败的时候使用会报错:AttributeError: 'NoneType' object has no attribute 'group'

    想查看匹配的对象用re.match("123","123asdfghh").group()

    re.match("asd","asdfghh")

    >>><re.Match object; span=(0, 3), match='asd'>

    re.match("asd","1233asdfghh")#开头没匹配到就返回None

    >>>

    re.match("asd","asdfghh").group()#查看匹配的内容

    >>>'asd'

    判断是否匹配成功

    import re

    if re.match("123","123sdf"):

        print(re.match("123","123sdf").group())

    else:

    print("没有匹配成功")

    2.re.search(“正则表达式”,”目标字符串”),在目标字符串的任意位置,只会成功匹配一次就结束,不会尝试多次匹配

     re.search("abs","sedeabs")

    <re.Match object; span=(4, 7), match='abs'>

    3..re.findall(“正则表达式”,”目标字符串”),匹配多个内容

    re.findall("123","123456123345123")

    ['123', '123', '123']

    正则表达式可以编译,可以复用,findall后面不支持.group()

    举个栗子:

    pattern=re.compile(r"abc")

    pattern.match("abc234").group()

    >>> 'abc'

    pattern.search("123abcdef").group()

    >>> 'abc'

    pattern.findall("abcdefgabc")

    >>> ['abc', 'abc']

    模糊匹配

    \d:匹配数字(digital)

    \D:匹配非数字

    re.search(r"\d","qwer12").group()#匹配数字

    >>>'1'

    re.search("\D","sdff845").group()#匹配非数字

    >>> 's'

    \w:匹配字母或数字

    \W:匹配非字符且也是非数字的情况

    re.search(r"\w","#$%wer123").group()

    >>>'w'

    re.search(r"\W","123#asd").group()

    >>>'#'

    \s:匹配一个空白字符:空格,\n\r\t

    \S:匹配一个非空白字符

    re.search(r"\s","#\t$123#asd").group()

    >>> '\t'

    re.search(r"\S","\r\n@\t$123#asd").group()

    >>> '@'

    z]:匹配小写字母 Z]:匹配大写字母 zA-Z]:匹配大小写字母

    re.search(r"[a-z]","asdADD").group()

    >>>'a'

    re.search(r"[A-Z]","asdADD").group()

    >>>'A'

    re.search(r"[a-zA-Z]","123asdDD").group()

    >>> 'a'

    匹配多个

    +:匹配至少一个,可以多个

    *:匹配0个或多个

    ?:匹配0个或1个

    {n,m}:匹配n个或者m个之间的个数都行

    re.search(r"[a-zA-Z]+","12asdDF").group()

    >>> 'asdDF'

    re.search(r"[a-zA-Z]*","12asdDF").group()

    >>> ''

    re.search(r"[a-zA-Z]{2,6}","12asdDF").group()#不确定时可以匹配范围

    >>> 'asdDF'

    re.search(r"\d+","12asdDF").group()

    '12'

    re.search(r"\D+","12asdDF").group()

    >>> 'asdDF'

     re.search(r"\w+","12asdDF").group()

    >>> '12asdDF'

     re.search(r"\d*?","a12asdDF").group()

    >>>''#因为*表示0个或多个,匹配第一个a前面没有数字也是满足0个的所以返回空’’

    re.search(r"\d*","12asdDF").group()

    >>> '12'

    re.search(r"\S*","12asdDF").group()

    >>> '12asdDF'

    re.search(r"\d{3}","12asd5677DF").group()#不能超过最多个数,否则会报错

    >>>'567'

    带有量词的情况下,正则都会进行最多元素的匹配,正则具有贪婪性

    抑制正则的贪婪性,量词后面加个?就可以了

    re.search(r"\d+?","12asdDF").group()

    >>> '1'

    .:是除了回车之外的任意字符,加个,re.S可以实现匹配回车

    举个栗子:

    re.search(".+","123asxc").group()

    >>> '123asxc'

    re.search(".+","123as \n\r\txc").group()#\n\r\t都是回车,不会匹配

    >>> '123as '

    re.search(".+","123as \n\r\txc",re.S).group()#加个,re.S可以实现匹配回车,S非空白字符

    >>> '123as \n\r\txc'

    #re.I可以忽略大小写(大写的i)

    举个栗子:

     re.search("as","as123df",re.I).group()#re.I可以忽略大小写

    >>>'as'

    re.search("as","AS123df",re.I).group()#re.I可以忽略大小写

    >>>'AS'

    开始和结尾的匹配,^表示开头的位置,$表示结尾

    >>> re.search(r"^\d+[A-Z]+$","123ASD").group()

    '123ASD'

    \b:单词边界,字符串的最前面和最后面,或者前面有空白字符

    举个栗子:

    re.search(r"ai","rain,ai")

    >>> <re.Match object; span=(1, 3), match='ai'>#这样匹配的是rain这个里面的ai,不是单词

    re.search(r"\bai","rain,ai")

    >>> <re.Match object; span=(5, 7), match='ai'>#这样匹配的是ai,是一个单词

    re.M表示带有\n\r\t回车的字符当成多行字符去处理

    举个栗子:

    re.search("\d+$","123\n345\n567")

    >>> <re.Match object; span=(8, 11), match='567'>#没有加re.M匹配到多行最后

    re.search("\d+$","123\n345\n567",re.M)

    >>> <re.Match object; span=(0, 3), match='123'>#加re.M匹配到多行最前

    再举个栗子:一般findall用的多

    re.findall(r"\d+$","df123\nwe345\nsdf456")

    >>> ['456']

    re.findall(r"\d+$","df123\nwe345\nsdf456",re.M)

    >>>['123', '345', '456']

    |表示或者的关系

    举个栗子:

    re.search(r"ab|cd","123ab")#表示ab可以cd也可以

    >>> <re.Match object; span=(3, 5), match='ab'>

    re.search(r"ab|cd","123cd")

    >>> <re.Match object; span=(3, 5), match='cd'>

     

    分组:在匹配的内容中,在匹配的结果中,在拿到一些需要的内容

    举个栗子:

    re.search(r"\d+cd","123cd")

    >>><re.Match object; span=(0, 5), match='123cd'>

    re.search(r"(\d+)cd","sdf123cd345")#(\+d)就是分组,在正则表达式里面加上一个()

    >>><re.Match object; span=(3, 8), match='123cd'>

    re.search(r"(\d+)cd","sdf123cd345").group(1)#分组后用group的坐标来取值

    >>>'123'

    re.search(r"(\d+)cd","sdf123cd345").group(0)

    >>>'123cd'

    re.search(r"ad(\d+)","sad12ad45")

    <re.Match object; span=(1, 5), match='ad12'>

    re.search(r"ad(\d+)","sad12ad45").group(0)

    >>> 'ad12'

    re.search(r"ad(\d+)","sad12ad45").group(1)

    >>> '12'

    re.search(r"(a)(d)(\d+)","sad12ad45").group(0)

    >>> 'ad12'

    re.search(r"(a)(d)(\d+)","sad12ad45").group(1)#表示结果要第1个括号的,而且可以嵌套,一个括号一个分组

    >>> 'a'

    re.search(r"(a)(d)(\d+)","sad12ad45").group(2)#表示结果要第2个括号的

    >>> 'd'

    re.search(r"(a)(d)(\d+)","sad12ad45").group(3)#表示结果要第3个括号的

    >>> '12'

    re.search(r"((a)(d)(\d+))","sad12ad45").group(0)

     

     

    小练习:

     

    匹配手机号:

    re.findall(r"\d{11}","qwwww15678904567sdf17834561230")

    匹配年月日

     

    匹配单词

    re.findall(r"[a-zA-Z]+","haha !$you are a good boy!是的")

    >>>['haha', 'you', 'are', 'a', 'good', 'boy']

    len(re.findall(r"[a-zA-Z]+","haha !$you are a good boy!是的"))#查询单子个数

    >>>6

    匹配ip:xxx.xxx.xxx.xxx4段数字,3个点

    re.findall(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}","123.345.4.34")

    >>> ['123.345.4.34']

    Processed: 0.010, SQL: 9