美文网首页
Python正则表达式

Python正则表达式

作者: 险蓝 | 来源:发表于2018-10-24 23:29 被阅读0次

    正则表达式中的一些符号:

     " . "是可以匹配到任意一个字符.

     " * "可以匹配到前面字符的0或很多,例如b*能匹配到一个b或者bbbb+个.

    " ^ "是开头匹配模式 ,例如^b.*就是匹配以开头为b的任意长度字符串,可以匹配到‘ ba ’也可以匹配到‘basdwa’。

    "$"结尾匹配,例如b$就是以b结尾的字符串。可以匹配到 'asdasb' 或者 'asb'也可以是'b'

    结合上面的符号我们进行一个例子:

    import re  #导入re模块

    line = "bobby123"  #需要匹配的字符串

    # 下面的 ^b.*3$ 大意是:以b开头,以3结尾,中间任意长度的字符串。

    model="(^b.*3$)"  #匹配模式,其中的圆括号()是提取字串。

    result = re.match(model, line) #match是re模块其中的一个匹配函数,第一个参数是匹配模式,第个参数是匹配字符串

    if result:

        print("true") #输出true   #结果为bobby123

    其中的圆括号是正则表达式的组,例如你想对网址www.baidu.com进行字符串baidu提起,而不想拿到前面的‘www.'和'.com'的话。只要把需要的部分用圆括号括起来就好了,例如匹配模式可以这么写" .*(baidu).* " 看下面代码例子:

    import re

    line = "www.baidu.com"

    model=".*(baidu).*"

    result= re.match(model, line)

    print(result.group(1)) #结果为' baidu '

    其中的result(1)就是对组里面的不同组进行提取,例如上面的"www.baidu.com"就是result(0)整个字符串。


    “?”是非贪婪模式,根据字符串去匹配最大的长度。为了说明这个字符我们先来看一下什么是贪婪模式:

    #贪婪模式

    #贪婪匹配模式,反向匹配,就是从右到左开始进行匹配

    line = "bobby123" #我们要从此字符串中提取bob

    model=".*(b.*b).*" #这段意思是:通过圆括号提取第一个字符是b,中间任意长度字符,结尾是b的字符串。

    result= re.match(model, line)

    print(result.group(1)) #结果为'bb ' 

    非贪婪模式:

     line = "bobby123" 

    model=".*?(b.*?b).*"  #非贪婪模式,会让匹配从左到右开始匹配

    result= re.match(model, line) 

    print(result.group(1)) #结果为'bob' ,如果你要是把圆括号里面的问号去掉匹配到的就是bobb了



    "+"至少匹配一次和多次

    line = 'aabbbbbaa'

    model =".*(b.+b).*" 

    result= re.match(model, line) 

    print(result.group(1))#结果为bbb,如果改为model =".*?(b.+b).*"  结果为bbbbb


    #“{数字}”前面字符串出现的次数

    model=".*(b.{1}b).*"   #中间的字符只能出现一次 例如 能匹配到'bab'或'bcb',但不能匹配到'basb'或'basdsadb'

    model=".*(b.{1,}b).*" #中间字符串能出现1次到多次,例如:能匹配到'bab'或'bcb',也能匹配到匹配到'basb'或'basdsadb'

    model=".*(b.{1,3}b).*" #中间字符串最少1次最多3三次,例如'bab''baab''baaab'


    #“|”或的意思

    model="bobby|bobby123" #匹配bobby 或者bobby123

    model="(boby|bobby)123" #匹配boby123 或者bobby123


    “[]”括号是任意一个数进行匹配

    例子1:

    model="[abcd]obby123"

    #上面这种模式智能匹配到'aobby123','bobby123','cobby123','dobby123'

    例子2:

    line = "17784667413" #对电话号码提取

    model="1[48357][0-9]{9}"

    #以1开头第二位数必须要是48357中的一位,[0-9]是匹配0到9之间的任意数字,{9}可以出现9次

    #[^]括号里放尖括号就是反的意思

    例如[^1]匹配到非1的字符

    line = "17" 

    model = "1[^7]"

    y=re.match(model, line) 

    print(y.group(0)) #输出none,因为line里面含有7,如果换成别的数字就是true


    []中括号里出现的‘.’‘*’不再是任意匹配了,而是匹配‘.’‘*’一个符号而已

    ‘ \s ’是代表空格的意思,‘ \S ’只要不是空格,任意字符都可以,只能匹配一个.

    #line = "你 好"中间有一个空格

    #regex_str="你\s好"  就能匹配到 “你 好”

    #line = "你很好"中间有一个空格

    #regex_str="你\S好"  就能匹配到 “你很好”

    "\w"任意字符相当于[A-Za-z0-9_] ,“\W”非'\w'的都可以,例如可以匹配到空格.

    当然也可以通过编码匹配汉字[\u4E00-\u9FA5]

    #line = "你 好"#中间有一个空格

    #model="([\u4E00-\u9FA5]+)" #输出为‘你’

    #因为‘你好’中间有一个空格,所以只能匹配到一个汉字。 你

    #line = "你好"#中间有一个空格

    #model="([\u4E00-\u9FA5]+)"  #。结果为 你好


    #"\d"是匹配数字 

    #line = "xxx出生于2001年"

    #regex_str=".*?(\d+)"  #。拿到数字 结果为2001


    混合模式

    把前面的内容进行集合,我们来匹配出生日期,但写法却很不一样,例如下面这几种类型:

    #line = "xxx出生于2001年6月2日"

    #line = "xxx出生于2001-6-2"

    #line = "xxx出生于2001-06-2日"

    #line = "xxx出生于2001-06"

    model=".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}.|[月/-]$|\d{1,2}.|$|[月/-]\d{1,2}))" match_obje = re.match(model, line)

    if match_obje:

        print(match_obje.group(1)) 

    相关文章

      网友评论

          本文标题:Python正则表达式

          本文链接:https://www.haomeiwen.com/subject/qlugzftx.html