zoukankan      html  css  js  c++  java
  • python中的正则匹配

    对于一个文本的字符串多行处理,如果使用split()函数,需要逐行处理,处理的代码也会比较复杂而且阅读体验感不是很好。re模块提供了的匹配函数,但是需要正则化相关的知识。

    对于正则表达式样式使用 Python 的原始字符串表示法;在带有 'r' 前缀的字符串字面值中,反斜杠不必做任何特殊处理。 因此 r" " 表示包含 '' 和 'n' 两个字符的字符串,而 " " 则表示只包含一个换行符的字符串。 样式在 Python 代码中通常都会使用这种原始字符串表示法来表示。

    特殊字符

    '.'在默认模式,匹配除了换行的任意字符。

    '^'匹配字符串的开头, 多行模式匹配换行后的首个符号。

    '$'匹配字符串尾或者换行符的前一个字符,多行模式匹配换行符的前一个字符。

    ''对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。 ab 会匹配 'a', 'ab'。

    '+'对它前面的正则式匹配1到任意次重复。 ab+ 会匹配 'a' 后面跟随1个以上到任意个 'b',它不会匹配 'a'。

    '?'对它前面的正则式匹配0到1次重复。 ab? 会匹配 'a' 或者 'ab'。

    “{m}”对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败。比如, a{6} 将匹配6个 'a' , 但是不能是5个

    {m,n}?前一个修饰符的非贪婪模式,只匹配尽量少的字符次数。比如,对于 'aaaaaa', a{3,5} 匹配 5个 'a' ,而 a{3,5}? 只匹配3个 'a'。

    []用于表示一个字符集合。在一个集合中
    符可以单独列出,比如 [amk]
    特殊字符在集合中,失去它的特殊含义。比如 [(+)] 只会匹配这几个文法字符 '(', '+', '', or ')'
    支持w or S
    不在集合范围内的字符可以通过 取反 来进行匹配。如果集合首字符是 '^' ,所有 不 在集合内的字符将会被匹配,比如 [^5] 将匹配所有字符,除了 '5'
    在集合内要匹配一个字符 ']',有两种方法,要么就在它之前加上反斜杠,要么就把它放到集合首位。比如, [()[]{}] 和 [{}] 都可以匹配括号。

    '|' A|B, 匹配满足A或者B任意正则.

    (...) 匹配括号中的正则表达式,也表示一个组。

    (?:re) 类似(...),但是不是一个组

    d 匹配数字[0-9]

    D 匹配非数字字符[^0-9]

    s 匹配空白字符[ fv]

    S 匹配非空白字符[^ fv]

    w 匹配字符数字字符下划线[a-zA-Z0-9_]

    W 匹配非字符数字字符下划线[^a-zA-Z0-9_]

    来看一个例子:

    >>> import re  
    >>> s = "adfad asdfasdf asdfas asdfawef asd adsfas " 
    
    # 匹配字符串
     >>> reObj3 = re.compile('w+s+w+')  
    >>> reObj3.findall(s)  
    ['adfad asdfasdf', 'asdfas asdfawef', 'asd adsfas']  
    
    # 匹配组
    >>> reObj2 = re.compile('(w+)s+w+')  
    >>> reObj2.findall(s)  
    ['adfad', 'asdfas', 'asd']  
    
    #匹配双重组
    >>> reObj1 = re.compile('((w+)s+w+)')  
    >>> reObj1.findall(s)  
    [('adfad asdfasdf', 'adfad'), ('asdfas asdfawef', 'asdfas'), ('asd adsfas', 'asd')]  
    
    

    findall函数返回的总是正则表达式在字符串中所有匹配结果的列表,此处主要讨论列表中“结果”的展现方式,即findall中返回列表中每个元素包含的信息。

    1.当给出的正则表达式中不带括号时,列表的元素为字符串,此字符串为整个正则表达式匹配的内容。
    2.当给出的正则表达式中带有一个括号时,列表的元素为字符串,此字符串的内容与括号中的正则表达式相对应(不是整个正则表达式的匹配内容)。
    3.当给出的正则表达式中带有多个括号时,列表的元素为多个字符串组成的tuple,tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应,并且排放顺序是按括号出现的顺序。

    参考文献

    https://docs.python.org/zh-cn/2.7/library/re.html
    https://zhuanlan.zhihu.com/p/37900841

  • 相关阅读:
    sprintf与snprintf
    风雨20年:我所积累的20条编程经验
    istream_iterator, ostream_iterator,copy以及文件序列化
    [转载]关于C++,我觉得好的设计法则
    如何高效地管理时间
    B站上适合程序员的学习资源【赶紧收藏!】
    Redis和Memcached的区别
    Swoole的多进程模块
    Mac OS 查看 ip 地址及 DHCP 各 addr 含义
    mac将phpstorm 从主屏移动到副显示器(解决)
  • 原文地址:https://www.cnblogs.com/hainingwyx/p/12013555.html
Copyright © 2011-2022 走看看