• python正则


    正則表達式RE为高级文本搜索模式匹配、搜索-替代等功能提供了基础。它是一种由字符和特殊符号组成的字符串,描写叙述了这些字符的某种反复方式,因此能按某种模式匹配一个有类似特征的字符串或字符串的集合。python正則表達式的相关模块为re模块。

    经常使用正則表達式符号和特殊字符——

    literal:匹配字符串的值。即literal本身
    re1|re2:匹配正則表達式re1或re2,能够理解为逻辑或
    .:匹配不论什么单个字符,换行符除外(python有方法取消这个限制的)
    ^:匹配字符串的開始
    $:匹配字符串的结尾
    *:匹配前面出现的正則表達式零次或多次
    +:匹配前面出现的正則表達式一次或多次
    ?:匹配前面出现的正則表達式零次或一次
    {N}:匹配前面出现的正則表達式N次
    {M,N}:匹配反复出现M次到N次的正則表達式
    […]:匹配字符组里出现的随意一个字符
    […x-y…]:匹配从字符x到y中的随意一个字符
    [^…]:不匹配此字符集中出现的随意一个字符,包括某一范围的字符
    (*|+|?|{})?:用于上面出现的不论什么“非贪婪”版本号,问号有两种含义。单独使用时表示匹配出现零次或一次的情况。紧跟在表示反复的元字符后面时,表示要求搜索引擎匹配的字符串越短越好。留下尽可能多的字符给后面的模式
    (…):匹配封闭括号里正則表達式,并保存为子组。

    圆括号能够对正則表達式进行分组或匹配子组。


    d:匹配不论什么数字,和[0-9]一样。D是d的反义
    w:匹配不论什么数字或字母字符,和[A-Za-z0-9]一样,W是w的反义
    s:匹配不论什么空白符。和[ vf]一样,S是s的反义
    :匹配单词边界,B是的反义
    n:匹配已保存的字组
    c:逐一匹配特殊字符c。即转义字符,有时候字符太多了easy令人困惑,可用python原始字符串,即在字符串的一開始加r字符。


    A:匹配字符串的開始,匹配字符串的结束

    以下介绍python正則表達式(re模块)常见的函数与方法——

    compile(pattern,flags=0):对正則表達式pattern进行编译,flags是可选标志符。并返回一个regex对象。

    由于预编译代码对象比字符串快。正則表達式又经常被用到,这时就用到了这个函数。
    match(pattern,string,flags=0):尝试用正則表達式模式pattern匹配字符串string,是从字符串的开头開始匹配的。flags是可选标志符,假设匹配成功。则返回一个匹配对象。否则返回None。
    search(pattern,string,flags=0):在字符串string中查找正則表達式模式pattern的第一次出现。flags是可选标志符。假设匹配成功,则返回一个匹配对象,否则返回None。
    findall(pattern,string[,flags]):在字符串string中查找正則表達式模式pattern的全部非反复出现,返回一个匹配对象的列表。
    finditer(pattern,string[,flags]):和findall()同样,但返回的不是列表而是迭代器。对于每一个匹配,该迭代器返回一个匹配对象。
    split(pattern,string,max=0):依据正則表達式pattern中分隔符吧字符string切割为一个列表,返回成功匹配的列表。最多切割max次,默认是切割全部匹配的地方。
    sub(pattern,rep1,string,max=0):把字符串string中全部匹配正則表達式pattern的地方换成字符串rep1,假设max的值没有给出。则对全部匹配的地方进行替换,另外另一个类似的subn()。
    group(num=0):返回全部匹配对象。或指定编号是num的子组。
    groups():返回一个包括全部匹配的子组的元组,假设没有成功匹配,就返回一个空元组。

    以下以一个样例展示search与match、贪婪与非贪婪模式的差别——

    待匹配的字符串str为:

    >>> str = 'Fri Jun,5 16:00:00 2015::aidearone@gmail.com::88888888-6-9'

    我们匹配str最后的数字段,即“88888888-6-9”。
    匹配模式patt为:

    >>> patt = 'd+-d+-d+'

    以下是search的结果(符合预期):

    >>> re.search(patt, str).group()
    '88888888-6-9'

    再来看一下match(失败了。由于match从字符串開始匹配,匹配失败返回None):

    >>> re.match(patt, str).group()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'NoneType' object has no attribute 'group'

    改动匹配模式为patt2(结果不正确):

    >>> patt2 = '.+d+-d+-d+'
    >>> re.match(patt2, str).group()
    'Fri Jun,5 16:00:00 2015::aidearone@gmail.com::88888888-6-9'

    再次改动匹配模式为patt3(分组,结果接近预期了。这是由于匹配模式是贪婪的):

    >>> patt3 = '.+(d+-d+-d+)'
    >>> re.match(patt3, str).group(1)
    '8-6-9'

    最后改动匹配模式为patt4(成功了,使用了非贪婪模式):

    >>> patt4 = '.+?

    (d+-d+-d+)' >>> re.match(patt4, str).group(1) '88888888-6-9'

  • 相关阅读:
    奈良有鹿
    Luogu P1892 团伙
    Luogu P1330 封锁阳光大学
    java读取property文件
    collection
    testNG学习
    maven项目学习
    Android.mk详解二
    sdk开发经验
    工作经验
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5120323.html
Copyright © 2020-2023  润新知