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

    一、元字符

    1、简介

            后面跟元字符,去除元字符的特殊功能;跟普通字符,实现特殊功能;
      d  数字 十进制;相当于[0-9]
      D 非数字 相当于[^0-9]
      w 数字或字母 相当于[Aa-z-Z0-9]
      W 数字或字母 相当于[^Aa-z-Z0-9]
      s 空格 相当于[ fv]
      S 空格 相当于[^ fv]
       匹配一个单词边界,也就是指单词和空格间的位置
      - -
      . 除换行符之外的任意字符
      * 任意个字符 0到无穷
      + 至少一个 1到无穷
      ? 0个或1个
      {} 设置几个
      [] 里面的字符取一个
      A|B A或B
      ^ 以什么开头.[^2]代表除2之外的值
      $ 以什么结尾

    2.注意事项

      ①数字 的作用 2的意思是,在2的位置是2组的内容
    y = re.search(r"(wang)(duo)(qiu)2", "wangduoqiuduo").group()
    print(y)
    
    #结果wangduoqiuduo
      ② 匹配一个单词边界,也就是指单词和空格(特殊字符)间的位置
    b=re.findall(r"wang","qiuwang duo")
    print(b)
    b=re.findall(r"wang","qiu wangduo")
    print(b)
    
    #结果['wang']  
            ['wang']
      ③注意这种情况  如果后面有限定条件,那么?不起作用
    f1=re.findall(r"a(d+)b","a23b")
    print(f1)
    f2=re.findall(r"(ad+?)","a23b")
    print(f2)
    
    #结果 ['23']
    ['a2']

    二、函数

    1.简介

      ①.match  从头匹配
      ②.search 匹配第一个符合规则的字符串
      ③.findall 将匹配到的所有内容放在一个列表中
      ④.finditer
      ⑤.sub 替换
      ⑥.compile 编译某个方法
      ⑦.split

    2.详细

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

      flag的参数:
      re.I 使匹配对大小写不敏感
      re.L 做本地化识别匹配
      re.M 多行匹配,影响^和$
      re.S 使"."匹配包括换行在内的所有字符
      re.U
      re.X

     
    search search(pattern, string, flags=0): 返回的是match对象,输出的时候加一个group才能输出
    r=re.search(r"([0-9]*)([a-z]*)([0-9]*)","123abc456").groups()
    print(r)
     
    #结果('123', 'abc', '456')

    match 和search匹配成功的话返回的都是一个match对象,下面写一下这个对象的功能
      start() 返回匹配开始的位置
      end() 返回匹配结束的位置
      sapn() 返回一个元组,包含匹配开始和匹配结束的位置
      group() 返回被re匹配的字符串
       group(n,m)返回组号为n,m所匹配的字符串
      groups() 获取匹配到的()中的所有结果,列为列表
      groupdict() 在(?P<n1>h) 输出结果为{n1:h}
        
    f=re.match(r"(?P<wangduo>q)(w+)yu","qiuyu wangduo qiuyu wangduo qicyu").groupdict()
    print(f)
    
    #结果{'wangduo': 'q'}

      ③findall findall(pattern, string, flags=0)  

      取得是组里面的内容;在括号前面加一个?:代表去掉优先捕获,即可以取得全部的内容;如果没有括号,那么就是跟match一样;findall捕获的是match中groups中的内容

        #取得是组里面的内容
    f=re.findall(r"q(w+)yu","qiuyu wangduo qiuyu wangduo qicyu")
    print(f)
    
    #结果['iu', 'iu', 'ic']
      #在括号前面加一个?:代表去掉优先捕获
    f=re.findall(r"q(w+)yu","qiuyu wangduo qiuyu wangduo qicyu")
    print(f)
    
    #结果['qiuyu', 'qiuyu', 'qicyu']
    
    
      # 如果没有括号,那么就是跟match一样
    f=re.findall(r"qw+yu","qiuyu wangduo qiuyu wangduo qicyu")
    print(f)
    
    #结果['qiuyu', 'qiuyu', 'qicyu']
      # findall捕获的是match中groups中的内容.不能加?P<>字典,怎样搞呢,见finditer
    f=re.findall(r"(q)(w+)yu","qiuyu wangduo qiuyu wangduo qicyu")
    print(f)
    
    #结果[('q', 'iu'), ('q', 'iu'), ('q', 'ic')]
      # 括号中再加一个括号.只要有括号,就要提取。方向是从左到右,从外到内。
    f=re.findall(r"(q)((w+)(u))(yu)","qiuyu wangduo qiuyu wangduo qicyu")
    print(f)
    
    #结果[('q', 'iu', 'i', 'u', 'yu'), ('q', 'iu', 'i', 'u', 'yu')]
      # 比较下面两个
    f=re.findall(r"asd*","asdasd")
    print(f)
    f=re.findall(r"(?:asd)*","asdasd")
    print(f)
    
    #结果['asd', 'asd']
    ['asdasd', '']
      ④finditer
    
    
    f3=re.finditer(r"(q)(?P<wang>w+)yu","qiuyu wangduo qiuyu wangduo qicyu")
    for i in f3:
        a=i.group()
        print(a)
        b=i.groups()
        print(b)
        c=i.groupdict()
        print(c)
    
    #结果
    qiuyu
    ('q', 'iu')
    {'wang': 'iu'}
    qiuyu
    ('q', 'iu')
    {'wang': 'iu'}
    qicyu
    ('q', 'ic')
    {'wang': 'ic'}
    View Code
      ⑤sub 替换  re.sub(pattern,repl,string,max=0)  2代表替换前两个
    
    
    s=re.sub("g.t","have","i gut a,i get b,i gct c",2)
    print(s)
    s,t=re.subn("g.t","have","i gut a,i get b,i gct c",2)
    print(s,t)
    
    #结果
    i have a,i have b,i gct c
    i have a,i have b,i gct c 2
    View Code
    
    
      ⑥compile  compile(pattern, flags=0拿3findall来举例子
    find = re.compile(r"qw+yu")
    c = find.findall("qiuyu wangduo qiuyu wangduo qicyu")
    print(c)
    
    #结果['qiuyu', 'qiuyu', 'qicyu']
    
    
      ⑦spilt 分割(pattern, string, maxsplit=0(最多分割几次), flags=0)
    
    
      # 无分组()的时候,输出无分割元素
    s="wang duo qiuyu qiuyu wang"
    p=re.split("qw+",s,maxsplit=1)
    print(p)
    
    #结果['wang duo ', ' qiuyu wang']
    
    
      # 有分组的时候,输出有分割元素
    s="wang duo qiuyu qiuyu wang"
    p=re.split("(qw+)",s,maxsplit=1)
    print(p)
    
    #结果['wang duo ', 'qiuyu', ' qiuyu wang']
    
    
      # 计算器去括号
    
    
    origin="((6*6+3)+(123+(456+459)*545+486)+156)"
    def f1(x):
        """
        计算加减乘除
        """
        return 1
    while True:
        print(origin)
        result = re.split(r"(([^()]+))",origin,1)
        if len(result)==3:
            # before=result[0]
            # center=result[1]
            # after=result[2]
            # 已经知道有三个元素,那么还可以这样写
            before,center,after=result
            r=f1(center)
            origin=before+str(r)+after
    
        else:
            print(f1(origin))
            break
    
    #结果:
    ((6*6+3)+(123+(456+459)*545+486)+156)
    (1+(123+(456+459)*545+486)+156)
    (1+(123+1*545+486)+156)
    (1+1+156)
    1
    1
    View Code
    
    

    3.杂货

    # 杂货
    # r'^d{3}-d{3,8}$ 加了r就不用考虑转义问题了。 以三个数字开头,-,以3-8个数字结尾
    # 非贪婪模式,加一个?
  • 相关阅读:
    O(logn)的乘方算法
    求递归算法时间复杂度:递归树
    Xcode6 创建静态库
    Intellij IDEA使用总结
    使用Entity Framework迁移完数据库后,每次修改代码(非模型代码)后都报错。
    Entity Framework Code First数据库自动更新
    Java中 堆 栈,常量池等概念解析(转载)
    使用MyEclipse9.0开发Web Service
    (转) Java源码阅读的真实体会
    Hibernate注解版设计学生、课程、成绩的关系映射
  • 原文地址:https://www.cnblogs.com/wangduoqiuyu/p/8552228.html
Copyright © 2011-2022 走看看