美文网首页python技术
day30(正则表达式)

day30(正则表达式)

作者: 冰封心动 | 来源:发表于2017-12-01 19:43 被阅读20次

    正则表达式

    正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

    Regular Expression的“Regular”一般被译为“正则”、“正规”、“常规”。此处的“Regular”即是“规则”、“规律”的意思,Regular Expression即“描述某种规则的表达式”之意。

    re模块

    在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re。

    re.match是用来进行正则匹配检查的方法,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串"")。

    匹配对象Macth Object具有group方法,用来返回字符串的匹配部分。

    import re

    #match从开头匹配,如果没有返回None

    ret = re.match('w','www.baidu.com')

    print(ret)

    print(ret.group())

    表示字符

    .点匹配任意一个字符

    []匹配[]里边任意一个字符

    \d匹配一个数字

    \D匹配一个非数字

    \s匹配一个空白,空格 Tab键

    \S匹配一个非空白

    \w匹配一个单词字符,中文,A-Z,a-z,0-9,_

    \W匹配一个非单词字符,中文,A-Z,a-z,0-9,_

    [\u4e00-\u9fa5]中文

    \表示转义

    r只对\有用

    例如:

    import re

    #.点匹配任意一个字符

    ret = re.match('.','1www.baidu.com')

    print(ret)

    print(ret.group())

    表示数量

    *匹配前一个字符出现0次或者无限次

     +匹配前一个字符出现1次或者无限次

     ?匹配前一个字符出现1次或者0次

     {m}匹配前一个字符出现m次

     {m,}匹配前一个字符至少出现m次

     {m,n}匹配前一个字符出现m到n次

    例如:

    import re

    ret = re.match(r'e*','ererrtrrfdgwc:\\a\\b')

    print(ret)

    print(ret.group())

    表示边界:

    ^匹配字符串开头

    $匹配字符串结尾

    \b匹配字符串边界

    \B匹配非字符串边界

    例如:

    import re

    #^匹配字符串开头

    ret = re.search(r'^err','errderrtrrfdgwc:\\a\\b')

    print(ret)

    print(ret.group())

    匹配分组

    [^a-z]表示除了a-z

    |匹配左右任意一个表达式

    (ab)将括号中字符作为一个分组

    \num引用分组序号num匹配到的字符串

    (?P)给分组起别名

    (?P=name)引用别名为name的分组匹配到的字符串

    例如:

    import re

    #(?P)给分组起别名

    ret = re.match(r'<(?P\w+)>(\w+)','haha')

    print(ret)

    print(ret.group(1))

    print(ret.group(2))

    re模块的高级用法

    match 方法:从起始位置开始查找,一次匹配

    search 方法:从任何位置开始查找,一次匹配

    findall 方法:全部匹配,返回列表

    finditer 方法:全部匹配,返回迭代器

    split 方法:分割字符串,返回列表

    sub 方法:替换

    贪婪和非贪婪

    Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

    非贪婪则相反,总是尝试匹配尽可能少的字符。

    在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。

    import re

    #贪婪和非贪婪

    pattern = re.compile(r'(.+)(\d+-\d+-\d+-\d+)')

    ret = pattern.match('This is a number 234-235-22-423')

    print(ret)

    print(ret.group())

    print(ret.group(1))

    print(ret.group(2))

    print('*****************************')

    pattern = re.compile(r'(.+?)(\d+-\d+-\d+-\d+)')

    ret = pattern.match('This is a number 234-235-22-423')

    print(ret)

    print(ret.group())

    print(ret.group(1))

    print(ret.group(2))

    结果:

    <_sre.SRE_Match object; span=(0, 31), match='This is a number 234-235-22-423'>

    This is a number 234-235-22-423

    This is a number 23

    4-235-22-423

    *****************************

    <_sre.SRE_Match object; span=(0, 31), match='This is a number 234-235-22-423'>

    This is a number 234-235-22-423

    This is a number

    234-235-22-423

    相关文章

      网友评论

        本文标题:day30(正则表达式)

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