• python/pandas 正则表达式 re模块


    目录

    • 正则解说
    • 中文字符集
    • re模块常用方法

    1、正则解说

    数量词的贪婪模式与非贪婪模式
      正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

    一般字符、字符集和转义字符

    一般字符 完全匹配字符 abc abc
    转义字符 . .
    . 匹配除换行符 以外的所有字符 . q, 1, +, ......
    [] 匹配字符集中任意字符 [abc] a, b, c
    s 匹配空白字符,即[ f ...] asb a b, a    b, ......
    S 匹配非空白字符 aSb ab, a4b, asb, ......
    w 匹配单词字符,即[a-zA-Z0-9] awc abc, a8c, ......
    W 匹配非单词字符,即[^a-zA-Z0-9] aWc a-c, a?c, ......
    d 匹配数字 adc a3c, ......
    D 匹配非数字 aDc adc, a-c, ......

    限定匹配次数

    * 匹配前一个字符0到无限次 ab*c ac, abc, abbc, ......

    +

    匹配前一个字符1到无限次 ab+c abc, abbc, ......

    ?

    匹配前一个字符0或1次 ab?c ac, abc

    {m}

    匹配前一个字符m次 ab{3}c abbbc

    {m,n}

    匹配前一个字符m至n次,m省略代表0至n次,n省略代表m至无限次 ab{2,3}c abbc, abbbc, ......

    *? +? ?? {m}? {m,n}?

    使得*,+,?{m},{m,n}变为非贪婪模式 ab*? a

    限定边界

    $ 匹配字符串末尾(多行模式下是每一行字符串末尾,re.M) c$ abc, 12c, ?-c, ......
    ^ 匹配字符串开头(多行模式下是每一行字符串开头,re.M) ^c cab, c12, c??, ......
    A 匹配整个字符串开头 Ac cab, ......
     匹配整个字符串末尾 c abc, ......

    逻辑、分组

    | 或,匹配左边或者右边的表达式 abc|def abc,  def, ......
    (...) 括号内为一组;分组有编号,从1开始算起;分组作为一个整体,|只在分组内部有效; (abc){1}.(123|456)+ abc.456, abc.123,  ......
    (?P<name>...) 除编号外的另一个分组名    
    <number> 引用编号为<number>的分组匹配的字符串 (d)abc1 5abc5, ......
    (?P=name) 引用别名为<name>的分组匹配到的字符串 (?P=<one>d)abc(?P=one) 7abc7, ......

    特殊构造

    (?iLmsux) iLmsux每个字符代表一个匹配模式 (?!abc) Abc, abc, ......
    (?#...) #之后的内容作为注释被忽略    
    (?=...) 之后的字符串内容需要匹配表达式,不消耗字符串内容 a(?=d) 后面是数字的a
    (?!...) 之后的字符串内容需要不匹配表达式,不消耗字符串内容 a(?!d) 后面不是数字的a
    (?<=...) 之前的字符串内容需要匹配表达式,不消耗字符串内容 (?<=d)a 前面是数字的a
    (?<!...) 之后的字符串内容需要不匹配表达式,不消耗字符串内容 (?<!d)a 前面不是数字的a

    2、中文字符集

    u"[u4e00-u9fa5]”
     

    3、re模块常用方法

    compile():编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用

    pa = re.compile('et')

    正则表达式对象的方法:

    group() 返回被 RE 匹配的字符串。
    start() 返回匹配开始的位置
    end()   返回匹配结束的位置
    span()  返回一个元组包含匹配 (开始,结束) 的位置

    常用方法:

    match():尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

    In [14]: re.match('I','I will never let it go, jack!')
    Out[14]: <_sre.SRE_Match object; span=(0, 1), match='I'>
    
    In [15]: re.match('w','I will never let it go, jack!')
    no out put

    search():扫描整个字符串并返回第一个成功的匹配

    In [17]: re.search('i','I will never let it go, jack!')
    Out[17]: <_sre.SRE_Match object; span=(3, 4), match='i'>

    findall():在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表,可指定起始位置

    In [28]: re.findall('.i', 'I will never let it go, jack!')
    Out[28]: ['wi', ' i']

      In [32]: re.compile('.i').findall('I will never let it go, jack!', 0, 10)
      Out[32]: ['wi']

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

    In [54]: for m in re.finditer('.i', 'I will never let it go, jack!'):
    ...: print(m, m.group(), m.start(), m.end(), m.span())
    ...:
    <_sre.SRE_Match object; span=(2, 4), match='wi'> wi 2 4 (2, 4)
    <_sre.SRE_Match object; span=(16, 18), match=' i'> i 16 18 (16, 18)

    sub():替换字符串中所有的匹配项,返回匹配后的字符串

    In [19]: re.sub('i', 'I', 'I will never let it go, jack!')
    Out[19]: 'I wIll never let It go, jack!'

    split():按照能够匹配的子串将字符串分割后返回列表,可指定最大分割次数

    In [41]: re.split(',', 'runoob, runoob, runoob.')
    Out[41]: ['runoob', ' runoob', ' runoob.']

      In [43]: re.split(',', 'runoob, runoob, runoob.', 1)
      Out[43]: ['runoob', ' runoob, runoob.']

  • 相关阅读:
    PHP设计模式:简单工厂
    MySQL实现两张表数据的同步
    SSH中Action的单例与多例
    Java日期时间操作的一些方法
    Null value was assigned to a property of primitive type setter of
    Android Studio创建AVD
    一台主机上安装多个Tomcat
    Tomcat指定的服务已存在
    Unsupported major.minor version 52.0问题的解决
    修改MySQL自动递增值
  • 原文地址:https://www.cnblogs.com/echo-coding/p/8854738.html
Copyright © 2020-2023  润新知