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

    Python正则表达式

    Python正则表达式有一个模块“re”,首先,在我们使用正则表达式的时候需要导入这个模块:

    import re

    分三个部分来介绍Python正则表达式:

    • 元字符
    • 预定义字符
    • 常用功能函数

    一、常用字符(元字符)

    注:python正则表达式元字符共11个,如下所示:

    .

    *

    +

    ?

    ^

    $

    |

    {}

    []

    ()

    下面将一一介绍:

    (1)"."

    功能:用于匹配任意(除 )外的字符

    如上,“.”能够匹配任意字符。

    注:search是常用的功能函数,将在第三部分介绍,这里只需要知道其第一个参数是模式,第二个参数是待匹配的字符串,返回结果是 match object对象。group是match object对象的方法。

    即在字符串(第二个参数)中寻找能够匹配的模式(第一个参数)

    (2)“”

    功能:转义字符,使后一个字符变为字面意思(取消元字符的特殊化)

    如上实例可见,元字符“.”不再具有特殊意义,而仅仅是一个字面值(字符.)

    (3)"*"

    功能:匹配前一个字符0次或多次(贪婪匹配)

    如上实例可见“*”前的字符b被匹配了3次

    (4)“+”

    功能:匹配前一个字符1次或无限次

    如上实例可见“+”前的字符n被匹配了4次

     (5)“?”

    功能:匹配前一个字符0次或1次

    如上实例分别展示了匹配“?”前的字符一次和零次。

    注:具体是零次还是一次是根据字符串中遇到的模式来定的

    (6)“^”

    功能:匹配字符串的开头(仅仅匹配开头),多行模式中匹配每一行的开头

    • 注:提前了解(之所以说提前了解是因为后面会在第三部分详细介绍)匹配失败之所以会报如上实例的错误的原因:

    因为search函数完成正则表达式的模式匹配,如果成功返回match object对象,如果失败返回None。而group是match object对象的方法,None对象没有这个方法所以报错。

    另:从如上实例的第二句也能够发现,纵使字符串的其他部分(非开头部分)有指定的模式(比如字符串的最末尾有abc),也不会再去匹配(因为^仅仅匹配开头)

    (7)“$”

    功能:匹配字符串的结尾(仅仅匹配结尾),多行模式中匹配每一行的结尾

     

    如上实例,用“^”来理解“$”就非常清楚了。

     (8)“|”

    功能:匹配左右表达式任意一个

    如上实例,“|”好比编程语言中的“或”

    (9)“{}”

    功能:{m},即匹配前一个字符m次。{m,n},即匹配前一个字符m至n次。

    如上实例,“{}”中一旦指定了次数,那就一定在指定次数的范围内

    (10)“[]”

    功能:字符集,对应的位置可以是字符集中的任意字符(注意是任意一个,从下面实例可发现),可逐个列出([abc]),也可以指定范围([a-c])

    如上实例只是简单的应用字符集,字符集的作用非常大。

    (11)“()”

    功能:将表达式分组

     

    如上实例,第一条有括号那么“a|k”为一个小组,即先匹配sdk然后再匹配a和k中的任意一个。

         第二条没有括号那么就是要么匹配sdka要么匹配k了

    可见()的功能很简单也很有用,能够实现复杂的正则表达式 

    二、预定义字符

    d

    D

    s

    S

    w

    W

    A

    

    

    B

    下面一一介绍:

    (1)“d”

    功能:匹配数字,即匹配[0-9]

    如上实例,d的作用就类似于之前讲的[0-9],即,匹配任意一个数字

    (2)“D”

    功能:匹配非数字,即[^d]

    如上实例,将d大写就好比取反(下面也有很多这种情况),D为匹配一个非数字

    (3)“s”

    功能:匹配任何空白字符[空格, , , ,f,v]

    注:回车符( )、换行符( )、水平制表符( )、垂直制表符(v)、换页符(f))

    如上实例,s匹配了一个空格符

    (4)“S”

    功能:匹配任何非空把你字符(刚好与s相反)

    如上实例,S实现的功能与s正好相反。且S匹配的任何非空白字符包括除了[空格, , , ,f,v]的一切。

    (5)“w”

    功能:匹配包括下划线在内的字符

    如上实例,w能够匹配数字、字母、下划线(三者为python标识符的组成)但不能匹配特殊字符

    (6)“W”

    功能:匹配特殊字符(与w刚好相反)

     

    如上实例,W匹配的是特殊字符(非标识符),与w刚好相反

    (7)"A"

    功能:仅匹配字符串开头(同之前将的元字符^类似)

    如上实例,根据元字符^来理解便可

    (8)“”

    功能:仅匹配字符串结尾(同之前的元字符$类似)

    如上实例,根据元字符$来理解便可

    (9)“”

    功能:匹配单词的边界(即,单词和非单词之间的位置),可左可右

     

    如上实例,第一条语句竟然出现匹配错误,出乎意料。其实,对比三条语句发现后两条的模式参数前加了“r”

    这是python比较尴尬的地方,因为如果不加“r”,字符串可能把其中的视为转义字符(回退),所以造成了匹配效果出乎意料。

    加上“r”让失去转义的意思。所以建议写正则表达式时在模式参数前面都加上"r"

    另,能够很方便的分离单词。

    (10)“B”

    功能:匹配单词的内部,即[^]

    如上实例,根据来理解B已经很清晰了

    三、常用功能函数

    compile

    match

    search

    findall

    finditer

    split

    sub

    subn

    相面将对这些常用功能函数做一一介绍:

    (1)“compile()”

    功能:编译正则表达式模式,返回一个对象模式。

    语法:

    re.compile(pattern,flags=0)

    参数:pattern为指定的模式,flags为一个标志位(默认为零)

    注:flags可取的值如下所示:

    re.I

    re.M

    re.S

    re.X

    IGNORECASE, 忽略大小写的匹配模式

    MULTILINE,多行模式, 改变^和$的行为

    DOTALL,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括换行符,也就是默认是不能匹配换行符

    VERBOSE,冗余模式, 此模式忽略正则表达式中的空白和#号的注释

    如上实例可见,利用compile将正则表达式编译好后,调用search进行匹配只需指定字符串便可

    (2)“match()”

    功能:决定是否在字符串刚开始的位置进行匹配。

    语法:

    re.match(pattern,string,flags=0)

    参数:pattern为指定的模式,string为待匹配的字符串,flags为一个标志位(默认为零)

    返回类型:匹配成功返回match object对象,匹配失败返回None对象

    注:由于match匹配成功返回match object对象,现介绍match object对象的一些常用方法:

    • group():返回被re匹配的字符串
    • groups():返回一个包含所有小组字符串的元组
    • start():返回匹配字符串开始的位置
    • end():返回匹配字符串结束的位置
    • span():返回一个元组,还元组由匹配字符串开始和结束的位置组成,即(开始位,结束位)注意,左闭右开

    (3)“search()”

    功能:在字符串中查找匹配模式,只要找到就第一个返回(match object对象),如未找到就返回None对象。

    语法:

    re.search(pattern,string,flags=0)

    参数:pattern为指定的模式,string为待匹配的字符串,flags为一个标志位(默认为零)

    返回类型:匹配成功返回match object对象,匹配失败返回None对象

    可见,之前已经用了太多的search方法来完成匹配:

    可见span返回的是(2,4),即左闭右开,字符串的开始时2,而结束不包括4

    (4)“findall()”

    功能:遍历匹配,获取字符串中所有匹配成功的子字符串,返回一个列表。

    语法:

    re.findall(pattern,string,flags=0)

    参数:pattern为指定的模式,string为待匹配的字符串,flags为一个标志位(默认为零)

    返回类型:匹配成功的字符串组成的列表

    如上实例可见,模式为[a-z]+,即所有为a-z(小写字母)组成的单词,从匹配结果也可以发现空格和“!”没有匹配,大写字母C也没有进行匹配。

    (5)“finditer()”

    功能:搜索string,返回一个顺序访问每个匹配结果的迭代器。

    语法:

    re.finditer(pattern,string,flags=0)

    参数:pattern为指定的模式,string为待匹配的字符串,flags为一个标志位(默认为零)

    返回类型:一个迭代器对象,迭代器中的每个元素均是match object类的实例对象

    如上实例可见,finditer不仅返回匹配成功的字符串的结果,也能够返回起始、结束下标等

    (6)“split()”

    功能:分割字符串。

    语法:

    re.split(pattern,string[,maxspilt])

    参数:pattern为指定的分割符,string为待分割的字符串,可选参数,maxsplit为最大分割次数(即最多只准将string切maxsplit刀)

    返回类型:一个列表,列表中的元素是被分割后的字符串,即List[String]

    (7)“sub()”

    功能:替换字符串中的每个子串。

    语法:

    re.sub(pattern,repl,string,count)

    参数:pattern为模式,repel为替换的内容,string待匹配的字符串,count默认为0,为替换个数(即,先用模式去匹配字符串,然后repl将匹配到的东西取代)

    返回类型:返回替换后的字符串

    (8)“subn()”

    功能:替换字符串中的每个子串。

    语法:

    re.subn(pattern,repl,string,count)

    参数:pattern为模式,repel为替换的内容,string待匹配的字符串,count默认为0,为替换个数(即,先用模式去匹配字符串,然后repl将匹配到的东西取代)

    返回类型:返回替换后的字符串与替换次数组成的元组,即(替换后的字符串,替换次数)


     

  • 相关阅读:
    elk 分布式数据同步
    mget 同时获取
    Jzoj1460 无题noname
    Jzoj1460 无题noname
    Jzoj1322硬币
    Jzoj1322硬币
    Jzoj1321 灯
    Jzoj1321 灯
    Jzoj1310 生日礼物
    Jzoj1310 生日礼物
  • 原文地址:https://www.cnblogs.com/thisyan/p/9643230.html
Copyright © 2011-2022 走看看