• python使用正則表達式


    python中使用正則表達式

    1. 匹配字符

    正則表達式中的元字符有 .  ^  $ *   +  ?  { }  [ ]   | ( )

    匹配字符用的模式有

    d 匹配随意数字 

    D 匹配随意非数字

    s 匹配随意空白字符

    S 匹配随意非空格字符

    w 匹配随意数字或者字母

    W  匹配随意非数字或者字母 

    2.  正則表達式

    python中使用compile处理正則表達式。如:

    import re;

    p=re.compile(‘[a-c]’);

    p.match(s);

    s是待匹配的字符串,match是匹配方法。类似的方法有

    match()   确定从行首開始匹配

    search()   在任何位置匹配

    findall()  找匹配的全部子串,并作为子串返回

    finditer()   找匹配的全部子串,而且以迭代器的形式返回

     

    match也有非常多方法。如:

    group()   把正則表達式匹配的字符串返回

    start()  返回匹配的起点

    end()   返回匹配的终点

    span()   返回匹配的(start,end)的元组

     

    例1:>>>import re;

    >>>p=re.compile(‘^[a-c]’)

    >>>q=p.match(“abcd”);

    >>>print q.group()

    ab

    >>>>q.span()

    (0,2)

    例2:

    >>>import re

    >>>p=re.compile(‘d+’);

    >>>q=p.findall(‘1 and 10 and 20’);

    >>>print q

    [‘1’,’2’,’3’]

     上述的匹配也能够使用第二种形式。即:

    re.match(’d+’,’d23r’)

    例3:

    >>>p=re.match(’d+’,’d23r’)

    >>>print p

    None

    匹配的其他參数:

    re.compile(‘[a-c]’,re.I)  re.I 表示忽略大写和小写

    re.compile(‘^ab$’,re.M)  re.M 表示^或者$在行首和行尾以及字符串的开头和结束都会进行匹配。

    假设不加这个标志。仅仅会在字符串的開始和结束之处匹配

    例4:

    re.compile(“””

    [1-3]       #1-3

    [a-c]      # a-c

    “””,re.VERBOSE

    )              re.VERBOSE  的出现使得正則表達式能够再多行出现,并且能够在每行加上凝视

    上面的匹配相当于 re.compile(‘[1-3][a-c]’)

    3.  分组

    使用()来进行分组

    例5:

    >>>p=re.compile(‘(12)+’)

    >>>m=p.match(‘121212’)

    >>>print m.group()

    121212

    上面匹配的是12反复出现一次或多次

    还能够打印分组的信息。

    >>>print m.group(1)

    12

    python会自己主动捕获分组的信息,假设不想捕获分组的信息。能够使用?:

    例6:

    >>>import re

    >>>s =”hello ab1cd”;

    >>>p=re.search(‘(?

    :h.*)(a.*)(c.*)’);

    >>>print “a* {0}”.format(p.group(1))

    a*   ab

    >>>print “c* {0}”.format(p.group(2))

    c*   cd

    p.group(0)存放的是整个表达式的匹配情况,p.group(1)存放的是(a.*)的匹配信息,p.group(2)存放的是(b.*)的匹配信息,而 h.*前面由于有?:没有被捕获

    假设分组过多。使用组的标号还是显得麻烦,这时能够对组进行命名,然后能够通过名字来使用它们。

    例7:

    >>>import re;

    >>>s=”hello ab1cd”

    >>>p=re.search(‘(?P<a>a.*)(?P<c>c.*)’);

    >>>print “a*  {0}”.format(p.group(‘a’)

    a*   ab

    >>>print “c*  {0}”.format(p.group(‘c’))

    c*   cd

    4.贪婪和非贪婪模式

    在贪婪模式下,* + 都会尽可能地多匹配字符。如:

    例8:

    >>>import re;

    >>>p=re.compile('<h.*></h>');

    >>>m=p.findall('<h1></h><h2></h>')

    >>>print m;

    [‘<h1></h><h2></h>’]

    有时希望它匹配出<h1></h>,<h2></h>两个结果。这时就能够用非贪婪模式了。仅仅要在*或.后面加上?。

    例9:

    >>>import re;

    >>>p=re.compile('<h.*?

    ></h>');

    >>>m=p.findall('<h1></h><h2></h>')

    >>>print m;

    [‘<h1></h>’,’<h2></h>’]

    5. 前向定界符和后向定界符

    假设先匹配模式A,在匹配模式B,能够使用A(?=B),假设先匹配模式A,并且希望后面没有B,能够使用A(?!B).

    例10:

    >>>import re;

    >>>s=”ab2cd”

    >>>m=re.search(“ab2(?=cd)”,s);

    >>>print m.group();

    ab2cd

    例11:

    >>>import re;

    >>>s='ab2cd'
    >>>m=re.search('ab2(?!cd)',s);
    >>>print m

    None

    类似地,假设匹配模式B,同一时候在其前面要有模式A,能够使用(?

    <=A)B的形式,

    假设匹配模式B,同一时候在其前面没有模式A。能够使用(?<!A)B的形式

     例12:

    >>>import re;

    >>>s=”ab2cd”;

    >>>m=re.search(‘(?<=ab2)cd’,s)

    >>>print m.group()

    cd

    例13:

    >>>import re

    >>>string= "ab2cd"
    >>>pattern = re.search(r'(?<!ab2)cd',string)
    >>>print pattern;

    None


  • 相关阅读:
    Codeforces Round #494 (Div. 3) D. Coins and Queries (贪心,数学)
    Codeforces Round #645 (Div. 2) D. The Best Vacation (贪心,二分)
    Codeforces Round #481 (Div. 3) F. Mentors (模拟,排序)
    Codeforces Round #646 (Div. 2) B. Subsequence Hate (思维,前缀和)
    windows的类似shell 命令操作 风行天下
    Linux防火墙iptables的策略 风行天下
    HP服务器安装配置教程 风行天下
    zabbix 监控数据库 及 tcp连接数 风行天下
    Linux日志 风行天下
    CENTOS 挂载ntfs移动硬盘 风行天下
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5198372.html
Copyright © 2020-2023  润新知