• 正则表达式和python的re模块


    0 正则表达式

    0.1 常见的元字符

    .:    匹配除 之外的任何单个字符

    *:    匹配前面的子表达式任意次,例如Zz*可以匹配Z,可以匹配Zz,也可以匹配Zzzzzzzzzz

    +:    匹配前面的子表达式任意次,例如hh+可以匹配hh,hhh,hhhhhhhhhhhhhhh

    {n}:    匹配前面的子表达式n次,例如h{5}匹配hhhhhh

    {n,}:    匹配前面的子表达式至少n次,例如h{5, } 匹配hhhhhh,hhhhhhhh,hhhhhhhhhhhhhhhhhh

    {n,m}:    匹配前面的子表达式n到m次

    ?:    匹配前面的子表达式0次或1次,等价于{0,1},如果跟在* + ? {n} {n,} {n,m}后面则代表非贪婪模式。例如hhhhh,用h+匹配得到一个结果hhhhh,用h+?则匹配到5个结果,5个都是h。

    :    转义字符,例如\n匹配 , 匹配换行符,\匹配,(匹配(

    ^:    匹配字符串的开头,例如^hello匹配hello world

    $:    匹配字符串的结尾,例如scut$匹配I am from scut

    [...]:    字符集,匹配中括号内的任意字符,-代表范围,^代表非,如果要表示[ ] - ^ 要在前面加上 或者把] - 放在首位,把^放到非首位,例如[^0-9]匹配非数字

    |:    或,匹配左右表达式任意一个,如果左边匹配成功,就不再匹配右边的表达式,例如convex|function匹配convex或者匹配function

    (...):    分组,作为一个整体被匹配,例如,(really ){5} 匹配really really really really really

    (?P<name>...):    分组,同时起一个别名

    (?P=name):    引用别名为name的分组匹配到的字符串

    <number>:    引用编号为number的分组匹配到的字符串

    d:    匹配数字,等价于[0-9]

    D:    匹配非数字,等价于[^0-9]

    s:    匹配不可见字符,等价于[f v], 是制表符x09, 是换行符x0a,v是垂直制表符x0b,f是换页符x0c, 是回车符x0d

    S:    匹配可见字符,等价于[^s]

    w:    匹配包括下划线的任何单词字符(unicode字符集),类似但不等价于[A-Za-z0-9_]

    W:    匹配任何非单词字符,等价于[^w]

    1 python中的正则

    1.1 反斜杠

    在编程语言中使用正则表达式,当我们要匹配的时候需要用4个来匹配,\\匹配,因为第一次编程语言会把\\转移成\,然后第二次正则会把\转移成。如果用python的原生字符串r来写正则,则可以少写两个,即r'\'匹配,r'\d'匹配'd',r‘d’则匹配数字

    1.2  re模块的使用

    # 首先将正则表达式编译成Pattern对象
    pattern = re.compile('keras')
    
    # 可以用Pattern对象的match方法匹配文本,从头开始但不要求完全的匹配,可在最后加入$则是完全匹配,返回Match对象或None
    match = pattern.match('keras is a high-level neural networks API')
    
    # 也可以用Pattern对象的search方法匹配文本,在文本中寻找子串的匹配,返回Match对象或None
    match = pattern.search('keras is a high-level neural networks API')
    
    # 用Match对象的方法输出匹配结果
    if match:
        print match.group()
    
    # 另外可以直接使用re的方法进行匹配,这样省了编译那一行,但是不能复用。
    re.match('tensorflow', 'tensorflow is an open-source library for Machine Intelligence')
    re.search('Machine Intelligence', 'tensorflow is an open-source library for Machine Intelligence')

    1.3  re.compile(pattern, flags=0)

    返回:Pattern对象

    pattern: 字符串形式的正则表达式,可利用上文的元字符和普通字符进行一系列组合得到

    flags: 匹配模式,分为如下几个(可用|使用多个,如re.I | re.

        re.I或re.IGNORECASE:忽略大小写

        re.L或re.LOCALE:使用当地locale。(python中有个locale模块,locale代表不同的语言,地区和字符集)

        re.U或re.UNICODE:使用unicode的locale

        re.M或re.MULTILINE:使用^或$时会匹配每一行的行首或行尾

        re.S或re.DOTALL:使用.时能匹配换行符

        re.X或re.VERBOX:忽略空白字符,而且可以加入注释

    1.4  Pattern对象

        Pattern对象代表一个正则表达式,包含如下几个方法,这些方法在re都有对应的方法,参数略有不同,下面也一起给出

        match(string, pos=0, endpos=-1) | re.match(pattern, string, flags=0):    从头开始匹配,返回一个Match对象或None。

        search(string, pos=0, endpos=-1) | re.search(pattern, string, flags=0):    寻找子串的匹配,返回一个Match对象或None

        split(string, maxsplit=0) | re.split(pattern, string, maxsplit=0, flags=0):    按照pattern切割string,maxsplit表示最大切割次数

        findall(string , pos=0, endpos=-1) | re.findall(pattern, string, flags=0):    搜索返回全部能匹配的子串

        finditer(string, pos=0, endpos=-1) | re.finditer(pattern, string, flags=0):    搜索返回match对象的迭代器

        sub(repl, string, count=0) | re.sub(pattern, repl, string, count=0, flags=0):    使用repl替换string中能匹配的每一个子串,返回替换后的子串,count指定最多替换次数。

        subn(repl, string, count=0) | re.subn(pattern, repl, string, count=0, flags=0):    相比于sub,多返回了一个次数,组成tuple。

    1.5  Match对象

        Match对象代表匹配的结果,包含匹配的相关信息。

        包含如下属性:string, re( 匹配时使用的Pattern对象), pos, endpos, lastindex(最后一个匹配的分组的下标), lastgroup(最后一个匹配的分组的别名)

        包含如下方法:

            group(group1, group2, group3,...):    

                返回一个或多个组匹配的子串,不填写参数默认为group(0),代表整个匹配的子串。

                group1可以是编号,也可以是组的别名。

                没匹配到的组返回None,匹配到多个子串的组返回最后一个。

            groups(default=None):    返所有组匹配的子串。当组没有匹配到子串时候返回default。

            groupdict(default=None):    返回字典,键为组的别名,值为该组匹配到的子串。没有别名的组不返回。

            start(groupNum=0):    返回指定组匹配的子串在string中的开始下标,没有匹配则返回-1    

            end(groupNum=0):    返回指定组匹配的子串在string中的结束下标,没有匹配则返回-1

            span(group=0):    返回(start(group), end(group))

    1.6  unicode编码

    python中re模块的正则最好统一使用unicode编码,即u'...'的形式。

    因为之前没有使用unicode,在匹配中文的时候出现了匹配错误的结果。

    猜测是re模块里的方法默认使用unicode编码来执行的。

  • 相关阅读:
    Zookeeper 选举机制
    Hadoop Yarn任务调度器
    Hadoop Yarn工作机制 Job提交流程
    Hadoop 切片机制
    Hadoop MapReduce工作流程
    Hadoop HDFS读写数据流程
    数据仓库 拉链表
    高动态范围照片*5
    Java实现的窗口计算器
    拍摄制作星轨拖尾视频 之 前期拍摄
  • 原文地址:https://www.cnblogs.com/liaohuiqiang/p/7459277.html
Copyright © 2020-2023  润新知