• Python re模块(正则表达式)


    一、简介

      正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。需导入re模块。强烈建议使用Python的“r”前缀,就不用考虑转义的问题。

    二、常用的字符含义

    1.预定义字符

    字符 含义 举例 结果
     d 数字:[0-9] adc a1c
    D 非数字:[^d] aDc abc
    s 匹配任何空白字符:[<空格> fv] asc a  c
    S 非空白字符:[^s] aSc abc
    w 匹配包括下划线在内的任何字字符:[A-Za-z0-9_] awc abc
    W 匹配非字母字符,即匹配特殊字符 aWc a  c
     匹配w和W之间,即匹配一个单词边界,也就是指被匹配的内容的左边(在左)或右边(在右)不能有字母或数字。例如, 'er' ,匹配"er"的左右旁不能有字母或数字。 abc

    abc%

    B [^] aBbc abc
    uxxxx 匹配以十六进制数编码的Unicode字符 [u4e00-u9fa5] 汉字/中文

    2.元字符

    字符 含义 举例 结果
    普通内容 匹配自身 abc abc
    . 匹配任意字符,除换行符" "外(在DOTALL模式中也能匹配换行符) a.c

    abc;

    a&c

    转义字符,使后一个字符改变原来的意思

    a.c;

    a\c

    a.c;

    ac

    * 匹配前一个字符任意次 abc*

    ab;

    abccc

    + 匹配前一个字符至少1次 abc+

    abc;

    abccc

    ? 匹配前一个字符0次或1次 abc?

    ab;

    abc

    ^ 匹配字符串开头。在多行模式中匹配每一行的开头 ^abc abc
    $ 匹配字符串末尾,在多行模式中匹配每一行的末尾 abc$ abc
    | 或。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式 abc|def

    abc

    def
    {} {m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若{m,},则匹配m至无限次 ab{1,2}c abc;
    abbc
    [] 字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。
       注:所有特殊字符在字符集中都失去其原有的特殊含义。用反斜杠转义恢复特殊字符的特殊含义。
    a[bcd]e abe;
    ace;
    ade
    () 被括起来的表达式将作为分组,从表达式左边开始没遇到一个分组的左括号"(",编号+1.
    分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。
    (abc){2}
    a(123|456)c
    abcabc
    a456c

    3.特殊分组

    分组 描述 举例 结果
    (?P<name>) 分组命名。字母P大写 (?P<id>abc){2} abcabc
    (?P=name) 引用命名分组匹配到的字符串 (?P<id>d)abc(?P=id) 1abc1;
    5abc5
    <number> 引用编号为<number>的分组匹配到字符串 (d)abc1 1abc1;
    5abc5

    三、常用方法

    1)re.match(pattern, string, flags):尝试从字符串的【开头】匹配【一个】模式。
      text="JGood 666666 is a handsome boy, he is cool, clever, and so on..."
      m=re.match(r"(w+)s", text) #结果是“JGood ”
      m=re.match(r"d+", text) #结果是None,因为数字不在开头

    2)re.search(pattern, string, flags):在【整个】字符串内查找模式匹配,只到找到第一个匹配就返回。
      text="JGood 666666 is a handsome boy, he is cool, clever, and so on..."
      m=re.search(r"d+", text) #结果是“666666”

    3)re.findall(pattern, string, flags):获取字符串中所有匹配的字符串。
      text="JGood 666666 is a handsome boy, he is cool, clever, and so on..."
      m=re.findall(r'e',text) #结果是['e', 'e', 'e', 'e']

    4)re.finditer(pattern, string, flags):获取字符串中所有匹配的字符串,并把它们作为一个迭代器返回。

    5)用正则表达式切分字符串比用固定的字符更灵活,如:
      re.split(r's+', 'a b c') #必须是re包的split()方法。以一个或多个空格切分。

    6)re.compile(pattern, flags):把模板pattern编译成正则对象,提高效率。

    compile方法flags值
    含义
    re.S(DOTALL)
    使.匹配包括换行在内的所有字符
    re.I(IGNORECASE)
    使匹配对大小写不敏感
    re.L(LOCALE)
    做本地化识别(locale-aware)匹配,法语等
    re.M(MULTILINE)
    多行匹配,影响^和$
    re.X(VERBOSE)
    该标志通过给予更灵活的格式以便将正则表达式写得更易于理解
    re.U
    根据Unicode字符集解析字符,这个标志影响w,W,,B

    7)正则表达式分组:用“()”表示的就是要提取的分组,然后用方法group(num1,num2)返回组号为num1,num2所匹配的字符串,groups()返回所有分组所组成的元组(通常不需参数)。
      正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。加问号“?”可以去除贪婪匹配。如:re.match(r'^(d+?)(0*)$', '102300').groups()

      

      至此,转载请注明出处。

  • 相关阅读:
    JMeter怎样测试WebSocket
    Android—基于OpenCV+Android实现人脸检测
    Android—实现科大讯飞语音合成
    Could not resolve com.android.support.constraint:constraint-layout:1.1.3.
    Mac上利用Aria2加速百度网盘下载
    将Excel表中的数据导入MySQL数据库
    Android Studio 添加模块依赖
    Mac上基于hexo+GitHub搭建个人博客(一)
    微信小程序—setTimeout定时器的坑
    微信小程序-腾讯地图显示偏差问题
  • 原文地址:https://www.cnblogs.com/wcwnina/p/7217699.html
Copyright © 2020-2023  润新知