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

      正则表达式,英文:Regular Expression。它通常用来检索和替换符合某种模式的文本。

      Python自1.5版本开始增加了re模块,使得Python拥有了全部的正则表达式功能。

    一、基本函数(match、search、findall)

      在使用re模块之前,要先引入,re模块使已经在内置在Python内部的,无需再自己下载安装了。

    1 import re

    1、re.match函数

    1.1 原型:match(pattern, string, flags=0)
    1.2 参数:
      pattern:匹配的正则表达式
      string:要匹配的字符串
      flags:标志位,用来控制正则表达式的匹配方式
        re.I:忽略大小写
        re.L:做本地化识别
        re.M:多行匹配,影响^和$
        re.S:使.匹配包括换行符在内的所有字符,否则.不匹配换行符
        re.U:根据Unicode字符集解析字符,影响'w W  B'
        re.X:使我们以更灵活的格式理解正则表达式
    1.3 功能:尝试从字符串的起始位置匹配一个模式

    1.4 eg:

    1 # 注释为输出结果
    2 
    3 print(re.match('www', 'www.baidu.com'))
    4 # <_sre.SRE_Match object; span=(0, 3), match='www'>
    5 # 返回结果的类型、匹配结果的位置、匹配内容
    6 
    7 print(re.match('www', 'www.baidu.com').span())
    8 # (0, 3) 输出匹配的位置

    2、re.search函数

    2.1 原型:search(pattern, string, flags=0)
    2.2 参数:
      pattern:匹配的正则表达式
      string:要匹配的字符串
      flags:标志位,用来控制正则表达式的匹配方式(与上面内容一致,后面不赘述)
    2.3 功能:扫描整个字符串,返回第一个成功的匹配,与match相比,就是不必从起始位置开始匹配

    3、re.findall函数

    3.1 原型:findall(pattern, string, flags=0)
    3.2 参数:
      pattern:匹配的正则表达式
      string:要匹配的字符串
      flags:标志位,用来控制正则表达式的匹配方式
    3.3 功能:扫描整个字符串,返回结果列表,其中匹配到所有符合模式的结果

     二、正则表达式的元字符

    1、匹配单个字符

    .

    可以匹配除换行符以外的任意字符

    []

    是字符集合,表示匹配方括号中任意所包含的任一字符

    [asd]

    匹配其中任一字符

    [a-z]

    匹配任意小写字母

    [0-9a-zA-Z_]

    匹配任意大小写字母或数字或下划线

    [^asd]

    匹配除了asd几个字母以外的所有字符,中括号里的^号称为'脱字符',表示不匹配集合中的字符

    [^0-9]

    匹配所有非数字字符

    d

    匹配数字,效果同[0-9]

    [^d]

    匹配非数字字符,效果同[^0-9]

    w

    匹配数字,字母和下划线,效果同[0-9a-zA-Z_]  (字母不包含空格)

    W

    匹配非数字,字母和下划线,效果同[^0-9a-zA-Z_]

    s

    匹配任意的空白符(空格,换行,回车,换页,制表),效果同[ f ]

    S

    匹配任意的非空白符,效果同[^ f ]

    2、锚字符(边界字符)

    ^

    行首匹配,和在中括号里的^不是一个意思

    $

    行尾匹配

    A

    匹配字符串的开始,他和^的区别是,A只匹配整个字符串的开头,即使在re.M下也不会匹配他行的行首

    

    匹配字符串的结束,他和$的区别是,只匹配整个字符串的结束,即使在re.M下也不会匹配他行的行尾

    

    匹配一个单词的边界,也就是指单词和空格间的位置 egr'er',匹配以er为结尾边界的位置

    B

    匹配非单词边界,与上面相反,匹配不是边界的

    3、多个字符

    (xyz)

    匹配小括号内的xyz,作为一个整体去匹配

    x?

    匹配0个或者1x

    egprint(re.findall(r"a?","aaabaa")) # 非贪婪匹配,尽可能少的匹配

    x*

    匹配0个或者任意多个x

    egprint(re.findall(r"a*","aaabaa")) # 贪婪匹配,尽可能多的匹配

    x+

    匹配至少一个x(贪婪匹配)

    x{n}

    匹配确定的nxn是一个确定的非负整数

    x{n,}

    匹配至少nx

    x{n,m}

    匹配至少n个,最多mx,注意n<=m

    x|y

    |表示或,匹配的是xy

    4、特殊情况

    *? +? x?

    最小匹配,通常都是尽可能多的匹配,可以使用这种解决贪婪匹配

    (?:X)

    类似于(xyz),但不表示一个组

    三、实用技巧

    1、字符串切割

    1 str1 = "hello world      hello world  hello world   "
    2 # 普通切割
    3 print(str1.split(' '))  # 仅仅以一个空格切割,遇到多个空格时会出现不想要的内容
    4 # 正则切割
    5 print(re.split(r' +', str1))  # 可以通过正则的切割,其中利用正则的方法,来以任意多个空格来切割

    2、re.finditer函数

    • 原型:finditer(pattern, string, flags=0)
    • 参数:
      • pattern:匹配的正则表达式
      • string:要匹配的字符串
      • flags:标志位,用来控制正则表达式的匹配方式
    • 功能:与findall类似,扫描整个字符串,返回的是一个迭代器,可以节省空间,提高效率
    1 str2 = "hello world hello world hello world hello world hello world"
    2 
    3 d = re.finditer(r'hello', str2)
    4 while True:
    5     # 当使用迭代方法时,为了可以使他在找完对象后退出,一般通过捕获的方法
    6     try:
    7       print(next(d))
    8     except StopIteration as e:
    9       break

    3、字符串的替换和修改

    • sub(pattern, repl, string, count=0, flags=0)
    • subn(pattern, repl, string, count=0, flags=0)功能: 在目标字符串中以正则表达式的规则匹配字符串,再把他们替换成指定的字符串。可以指定替换的次数,如果不指定,替换所有的匹配字符串
      • pattern: 正则表达式(规则)
      • repl: 指定的用来替换的字符串
      • string: 目标字符串
      • count: 最多替换次数
      • flags:
    • 区别: sub返回一个字符串,subn返回一个元组(第一个元素是替换后的字符串,第二个元素是替换的个数)

    4、分组

      概念:除了简单的判断是否匹配以外,正则表达式还有提取子串的功能。用()表示的就是提取分组。(这个自己试一下,加深印象)

     1 str3 = "010-12312323"
     2 m = re.match(r'(?P<first>d{3})-(d{8})', str3)
     3 # 使用序号获取对应组的信息,group(0)一直代表的原始字符串
     4 print(m.group(0))
     5 print(m.group(1))
     6 print(m.group('first'))  # 使用自己起的名字索引
     7 print(m.group(2))
     8 
     9 print(m.groups())  # 查看各组的情况
    10 
    11 # 如果在最外层加一个括号,那么group(1)就是打印的最外面的那个,依次向里
    12 
    13 # ?P<first>写在小括号里,表示起名字

    5、编译

    • 当我们使用正则表达式时,re模块会干两件事:

      (1)编译正则表达式,如果正则表达式本身不合法,会报错
      (2)用编译后的正则表达式去匹配对象

    • 编译的原型:re.compile(pattern, flags=0)

      提示:一般情况下,比较简单的匹配我们直接通过上面讲述的那几种基本方法就可以了,但是当模式比较复杂,或者这个正则对象在后面还会用到时,就会先把他编译出来,毕竟后面可以省去再次编译的时间,并且更清晰。

      正则对象,习惯上命名为   re_xxxxxx。

    1 pat = r"^1(([3578]d)|(47))d{8}$" # 模式
    2 re_telephone = re.compile(pat)  # 编译成正则对象
    3 print(re_telephone.match("13612345678"))  # 使用其匹配文本,前面提到的基本方法在这里照常使用

     

    作者:渔单渠 微信搜索“小田学Python”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    C# 字符串转换值类型
    C#判断字符串为空
    c#转义字符
    python各种类型的转换
    mysql创建新用户及新用户不能本地登陆的问题
    数据探索的方法
    使用requests爬取猫眼电影TOP100榜单
    Python中的正则表达式教程
    Anaconda多版本Python管理以及TensorFlow版本的选择安装
    Xshell访问虚拟机内Linux
  • 原文地址:https://www.cnblogs.com/yudanqu/p/9403214.html
Copyright © 2011-2022 走看看