zoukankan      html  css  js  c++  java
  • python之re模块

    re模块中常用功能函数

    一、加载模块  

    import re

    二、编译正则表达式

    re.compile(pat, flags = 0) #把一个正则表达式pat编译成正则对象并返回,以便可以用正则对象的match和search等方法。

    pat 编译时,正则表达式字符串

    flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:

    re.I
    re.IGNORECASE
    
    让正则表达式忽略大小写,这样一来,[A-Z]也可以匹配小写字母了。此特性和locale无关。
    re.L
    re.LOCALE
    让w、W、、B、s和S依赖当前的locale。
    re.M
    re.MULTILINE
    影响'^'和'$'的行为,指定了以后,'^'会增加匹配每行的开始(也就是换行符后的位置);'$'会增加匹配每行的结束(也就是换行符前的位置)。
    re.S
    re.DOTALL
    影响'.'的行为,平时'.'匹配除换行符以外的所有字符,指定了本标志以后,也可以匹配换行符。
    re.U
    re.UNICODE
    让w、W、、B、d、D、s和S依赖Unicode库。
    re.X
    re.VERBOSE
    运用这个标志,你可以写出可读性更好的正则表达式:除了在方括号内的和被反斜杠转义的以外的所有空白字符,都将被忽略,而且每行中,一个正常的井号后的所有字符也被忽略,这样就可以方便地在正则表达式内部写注释了。
    
    a = re.compile(r"""d +  # the integral part
                       .    # the decimal point
                       d *  # some fractional digits""", re.X)
    b = re.compile(r"d+.d*")
    re.search(pattern, string[, flags])

    三、搜索,执行功能函数

    1、贪婪与非贪婪搜索

      *','+'和'?'(*?, +?, ??, {m,n}?)都是贪婪的,匹配尽可能多的模式字符串;可以在后面加个问号,将贪婪改为非贪婪,只匹配尽量少的模式字符串。

    2、匹配分组:(...)

      匹配圆括号里的RE匹配的内容,并指定组的开始和结束位置。组里面的内容可以被提取(0代表所有匹配内容,n代表第n个分组匹配内容),也可以采用 umber这样的特殊序列,被用于后续的匹配。要匹配字面意义上的'('和')',可以用反斜杆转义:(、),或是包含在反括号内:[(]、[)]。

    3、搜索匹配

    3.1 re.match和re.search

      re.match(pat, string[, flags = 0])

      如果字符串string的开头和正则表达式pat匹配的话,返回一个相应的MatchObject的实例,否则返回None

      re.search(pat, string[, flags = 0])

      在字符串内查找模式匹配(不一定是string开头),只要找到第一个匹配就返回一个相应的MatchObject的实例,否则返回None。

      注:MatchObject对象有以下方法:

      1⃣️m.group() 不加参数,返回re整体匹配的字符串;

      2⃣️m.group(n, m) 返回一个或多个子组。如果参数为一个,就返回一个子串;如果参数有多个,就返回多个子串注册的元组。如果不传任何参数,效果和传入一个0一样,将返回整个匹配。如果某个groupN未匹配到,相应位置会返回None。如果某个groupN是负数或者大于group的总数,则会抛出IndexError异常。 

      3⃣️m.start([group])和m.end([group]) 返回的是被组group匹配到的子串在原字符串中的位置。如果不指定group或group指定为0,则代表整个匹配。如果group未匹配到,则返回 -1。

        对于指定的m和g,m.group(g)和m.string[m.start(g):m.end(g)]等效。
        如果group匹配到空字符串,m.start(group)和m.end(group)将相等。

      4⃣️m.span([group]) 返回一个元组,包含匹配 (开始,结束) 的位置

      5⃣️m.groups() 返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。

    3.2 re.findall(pat, string, flags = 0)

      遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。

    import re
    tt = "Tina is a good girl, she is cool, clever, and so on..."
    rr = re.compile(r'w*oow*')
    print(rr.findall(tt))
    print(re.findall(r'(w)*oo(w)',tt))#()表示子表达式 
    执行结果如下:
    ['good', 'cool']
    [('g', 'd'), ('c', 'l')]
    

     3.3 re.finditer(pat, string, flags = 0)

      搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。

    iter = re.finditer(r'd+','12 drumm44ers drumming, 11 ... 10 ...')
    for i in iter:
        print(i)
        print(i.group())
        print(i.span())
    执行结果如下:
    <_sre.SRE_Match object; span=(0, 2), match='12'>
    (0, 2)
    <_sre.SRE_Match object; span=(8, 10), match='44'>
    (8, 10)
    <_sre.SRE_Match object; span=(24, 26), match='11'>
    (24, 26)
    <_sre.SRE_Match object; span=(31, 33), match='10'>
    (31, 33)
    

     3.4 re.split(pat, string[, maxsplit])

      按照能够匹配的子串将string分割后返回列表。可以使用re.split来分割字符串,如:re.split(r's+', text);将字符串按空格分割成一个单词列表。maxsplit用于指定最大分割次数,不指定将全部分割。

    3.5 re.sub(pat, repl, string[, count])

      将string里,匹配pat的部分,用repl替换掉,最多替换count次(剩余的匹配将不做处理),然后返回替换后的字符串。如果string里没有可以匹配pattern的串,将被原封不动地返回。repl可以是一个字符串,也可以是一个函数。

      如果repl是个函数,每次pattern被匹配到的时候,都会被调用一次,传入一个匹配到的MatchObject对象,需要返回一个字符串,在匹配到的位置,就填入返回的字符串。

    >>> def dashrepl(matchobj):
    ...     if matchobj.group(0) == '-': return ' '
    ...     else: return '-'
    >>> re.sub('-{1,2}', dashrepl, 'pro----gram-files')
    'pro--gram files'
    

       re.subn(pattern, repl, string[, count]) 跟上面的sub()函数一样,只是它返回的是一个元组 (新字符串, 匹配到的次数)

  • 相关阅读:
    又一道简单的题
    atoi函数的使用(将字符串转换成整型数)
    【贪心】Radar Installation(POJ1328)
    【BFS】鸣人与佐助
    谍报分析
    适配器模式(C++实现)
    策略模式(C++)
    工厂模式(C++实现)
    桥接模式(C++实现)
    关于getMemory函数的几点思考
  • 原文地址:https://www.cnblogs.com/xiaofeiIDO/p/7645696.html
Copyright © 2011-2022 走看看