zoukankan      html  css  js  c++  java
  • 简介Python正则表达式

    一、概念

    简单来说正则表达式是由一些普通字符(例如,a 到 z 之间的字母)和一些元字符组成,用来匹配和过滤一些字符串的一种逻辑公式。

    二、正则表达式的一些基本规则

    1、一些常用的元字符

      ^  :匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置。

      $  :匹配行或字符串的结尾。

     d  :匹配数字字符。

     D  :匹配一个非数字字符。

     w :匹配字母,数字,下划线。

    W  :匹配任何非单词字符(也就是非字母、数字、下划线字符)。

     s  :匹配任何不可见字符(包括空格、Tab等空白符) 。

     S  :匹配任何可见字符。

      .   :匹配除了换行符以外的任何字符。

      :匹配一个换行符。

      *   :匹配前面的子表达式任意次(匹配0个或多个字符)。如,ab*能匹配“a”,也能匹配“ab”以及“abb”。*等价于{0,}。

     +   :匹配前面的子表达式一次或多次(大于等于1次)。如,“ab+”能匹配“ab”以及“abb”,但不能匹配“a”。+等价于{1,}。

     ?   :匹配前面的子表达式零次或一次。如,“ab(cd)?”可以匹配“ab”或“abcd”。?等价于{0,1}。

    {n} : n是一个非负整数。匹配确定的n次。如,“b{2}”不能匹配“abc”中的“b”,但是能匹配“abbc”中的两个b。

    {n,}: n是一个非负整数。至少匹配n次。如,“b{2,}”不能匹配“abc”中的“b”,但能匹配“abbbbbbc”中的所有b。“b{1,}”等价于“b+”。“b{0,}”则等价于“b*”。

    {n,m} :m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。如,“b{1,3}”将匹配“abbbbbbc”中的前三个b为一组,后三个b为一组。“b{0,1}”等价于“b?”。

    x|y  :匹配x或y。如,“a|bbc”能匹配“a”或“bbc”。“[ab]ccd”则匹配“accd”或“bccd”。

    [xyz] :字符集合。匹配所包含的任意一个字符。如,“[abc]”可以匹配“abc”中的“a”或“sb”中的“b”。

    [^xyz] :负值字符集合。匹配未包含的任意字符。如,“[^abc]”可以匹配“apple”中的“pple”任一字符。

    [a-z] :字符范围。匹配指定范围内的任意字符。如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符;[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线。

     注:对于一些特殊字符需要表达原有符号需要先使字符"转义",即,将反斜杠字符 放在它们前面。如,要匹配 * 字符,则使用 *。特殊字符有:$、( )、*、+、.、[ ]、?、、^、{ }、|。

    2、运算符优先级

    正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

    相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

    运算符描述
    转义符
    (), (?:), (?=), [] 圆括号和方括号
    *, +, ?, {n}, {n,}, {n,m} 限定符
    ^, $, 任何元字符、任何字符 定位点和序列(即:位置和顺序)
    | 替换,"或"操作
    字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

    三、Python中正则表达式使用的函数

     Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。

    1、re.match函数

    re.match 从字符串的起始位置开始匹配,如果第一个就不匹配,则返回None。

    re.match(pattern, string, flags=0)

    pattern:匹配的正则表达式。

    string : 要匹配的字符串。

    flags :标志位,用于控制正则表达式的匹配方式。如是否区分大小写等。

    如:

     1 #coding:utf-8
     2 #!/usr/bin/python3
     3 import re
     4 
     5 s1="abc"
     6 s2=" asd"
     7 a=re.match(r'[a-zA-Z\_][0-9a-zA-Z\_]*', s1)
     8 b=re.match(r'[a-zA-Z\_][0-9a-zA-Z\_]*', s2)
     9 print(a)
    10 print(b)
    11 
    12 
    13 #运行结果
    14 <_sre.SRE_Match object; span=(0, 3), match='abc'>
    15 None
    demo

    2、re.search函数

    re.search 扫描整个字符串并返回第一个成功的匹配,如果整个字符串都没有匹配的,则返回None。

    re.search(pattern, string, flags=0)
    

    pattern:匹配的正则表达式。

    string : 要匹配的字符串。

    flags :标志位,用于控制正则表达式的匹配方式。如是否区分大小写等。

    如:

     1 #coding:utf-8
     2 #!/usr/bin/python3
     3 import re
     4 
     5 s1="gabc"
     6 a1=re.match(r'[abc]', s1)
     7 print(a1)
     8 
     9 s2="gabc"
    10 a2=re.search(r'[abc]', s2)
    11 print(a2)
    12 
    13 s3="get"
    14 a3=re.search(r'[abc]', s3)
    15 print(a3)
    16 
    17 #运行结果
    18 None
    19 <_sre.SRE_Match object; span=(1, 2), match='a'>
    20 None
    21 #match从第一个开始匹配,第一个不匹配就返回None,search全局匹配,直到没有匹配的才返回None。
    demo

     3、re.compile 函数

    compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,让其它用来匹配的函数使用,如match、search函数使用。

    compile(pattern, flags=0)
    

    pattern:匹配的正则表达式。  

    flags :标志位

    一般配合其他函数使用,如和match函数:

    re.compile(pattern).match(string)
    

    使用情况如:

    #coding:utf-8
    #!/usr/bin/python3
    import re
    
    s='abcdf13s2j3'
    a=re.compile(r'd+').match(s)
    print(a)
    a=re.compile(r'd+').search(s)
    print(a)
    a=re.compile(r'd+').findall(s)
    print(a)
    
    
    #运行结果
    None
    <_sre.SRE_Match object; span=(5, 7), match='13'>
    ['13', '2', '3']
    demo

    4、re.findall函数

    在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

    findall(pattern, string, flags=0)           #单独使用
    findall(self, string, pos=0, endpos=-1)     #与compile函数一起使用
    

    pattern:匹配的正则表达式。

    string : 要匹配的字符串。

    flags :标志位

    pos : 可选参数,指定字符串的起始位置,默认为 0。

    endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

    如:

     1 #coding:utf-8
     2 #!/usr/bin/python3
     3 import re
     4 
     5 s='abcdf12s2j3'
     6 a=re.findall(r'd+',s)      #单独使用
     7 print(a)
     8 a=re.compile(r'd+').findall(s)   #与compile函数一起使用
     9 print(a)
    10 
    11 #运行结果
    12 ['12', '2', '3']
    13 ['12', '2', '3']
    demo

    5、re.finditer函数

    和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

    finditer(pattern, string, flags=0)
    

    pattern:匹配的正则表达式。

    string : 要匹配的字符串。

    flags :标志位

     1 #coding:utf-8
     2 #!/usr/bin/python3
     3 import re
     4 
     5 a = re.finditer(r"d+","ab57cdf13s2j3")
     6 print(a)
     7 for match in a:
     8     print (match.group() )
     9 
    10 
    11 #运行结果
    12 <callable_iterator object at 0x00E434D0>
    13 57
    14 13
    15 2
    16 3
    demo

    6、group()与groups()函数

    group()  :匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

    groups():返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

    如:

     1 #coding:utf-8
     2 #!/usr/bin/python3
     3 import re
     4 
     5 a = re.search(r"(D+)(d+)(D+)(d+)(D+)(d+)","ab57cdf13s2j3")
     6 if a:
     7    print("a.group() : ", a.group())
     8    print("a.group(1) : ", a.group(1))
     9    print("a.group(2) : ", a.group(2))
    10    print("a.group(6) : ", a.group(6))
    11    print("a.groups() : ", a.groups())
    12 else:
    13    print ("Nothing found!!")
    14 
    15 #运行结果
    16 a.group() :  ab57cdf13s2
    17 a.group(1) :  ab
    18 a.group(2) :  57
    19 a.group(6) :  2
    20 a.groups() :  ('ab', '57', 'cdf', '13', 's', '2')
    demo

    7、re.sub函数

     用于替换字符串中的匹配项。

    sub(pattern, repl, string, count=0, flags=0)
    

    pattern : 匹配的正则表达式。

    repl : 替换的字符串,也可为一个函数。

    string : 要被查找替换的原始字符串。

    count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

    如:

     1 #coding:utf-8
     2 #!/usr/bin/python3
     3 import re
     4 
     5 s='abcdf13s2j3'
     6 a=re.sub(r'd+','-',s,1)     #替换一个
     7 print(a)
     8 a=re.sub(r'd+','-',s)        #全部替换
     9 print(a)
    10 
    11 #运行结果
    12 abcdf-s2j3
    13 abcdf-s-j-
    demo

     

    参考学习网址:

    http://www.runoob.com/regexp/regexp-operator.html

    http://www.runoob.com/python/python-reg-expressions.html

    注:参考上面博文,根据自己理解整理一份,有些是直接把作者简介拷贝过来的。

  • 相关阅读:
    Redisson分布式锁学习总结:公平锁 RedissonFairLock#lock 获取锁源码分析
    Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析
    Redisson分布式锁学习总结:公平锁 RedissonFairLock#unLock 释放锁源码分析
    npm更改为淘宝镜像
    博客园统计阅读量
    自动下载MarkDown格式会议论文的程序
    修改linux ll 命令的日期显示格式
    Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存
    Log4j2 Jndi 漏洞原理解析、复盘
    一个菜鸡技术人员,很另类的总结
  • 原文地址:https://www.cnblogs.com/olivexiao/p/10449109.html
Copyright © 2011-2022 走看看