python 正则表示法

正则
正则表达式元字符如下:. ^ $ * + ? { } [ ] \ | ( ) 
符号 说明
  .

* 匹配任意单个字符(除换行符\n外)
    - 无论字母、数字、空格(不包括'\n'换行符)、可打印字符、
    不可打印字符,还是一个符号,使用点号都能够匹配

* 例:
    1、 表达式: f.o (匹配在字母 f 和 o 之间的任意一个字符;例如:fao, f9o, f#o)
    2、 表达式: .. (任意两个字符)
    3、 表达式: .end (匹配字符串end前的任意一个字符)

\w * 表示全部的字母数字的字符集,相当于 [a-zA-Z0-9_]缩写形式
\d * 任何十进制数字  与 [0-9] 一致
\s * 表示空格字符 [空格 \t \r \n \f \v]
‘^’‘$’

* '^' 匹配字符串开头,在多行模式中,匹配每一行的开头

* '$' 匹配字符串末尾,在多行模式中,匹配每一行的末尾

* 从字符串起始或者结尾或者单词边界匹配  


* 例:
    1、 表达式: ^From (任何以 F 开头 ,后边是 rom 的字符串)
    2、 表达式: /bin/tcsh$ (任何以 h 结尾, 前边是 /bin/tcsh 的字符串)
    3、 表达式: ^Subject:hi$ (任何有单独的字符串 Subject:hi 构成的字符串)

^, $ 都有特殊意义,如果要想匹配字符串中 “^” 和 “$” 字符,则表达式就需要写成 “\^” 和 “\$”

    * 使用 \(反斜线)

    * 例: 
        1、 ^\^From (任何以 ^F 起始的字符串)
        2、 Subject.hi\$$ (任何以 Subject.hi$ 作为结尾的字符串)

\b(匹配边界)
 和  \B(匹配非边界)

* ‘\b’匹配一个单词边界,也就是指字符和空格间的位置。

* 例:
     'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

* ‘\B’匹配非单词边界,等同 [^\b]

* 例:
    'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

限定范围
和 
否定 [^...]

* 除符号 '^' 以外其它所有元字符在字符集中都失去其原有的特殊含义,
用\反斜杠转义恢复特殊字符的特殊含义。

* [] 中两个字符用 '-' 连接,用于指定一个字符的范围,如 :
    1、[0-9a-zA-Z] 匹配 0-9中任意数字 或 a-z中任意字符 或 A-Z 中任意字符

* 如果 '^ '紧跟在左侧括号后边,表示不匹配给定字符集中的任何一个字符,如:

    1、[^aeiou] 不匹配 aeiou 这些字符
    2、[^\t\n] 不匹配制表符或者\n

*+{N}{M,N}

* '* ' 表示匹配 至少出现 0 次
    - reFunc('[dn]ot*', 'do', 'no', 'dont', 'not')

* '+ ' 表示最少出现一次
    - reFunc('[dn]ot+', 'do', 'no', 'dont', 'not')
    
* '? ' 表示最少出现 0 次,最多出现 1 次
    - reFunc('[dn]ot?', 'do', 'no', 'dot', 'not') 
    
* '{N}' 表示出现 N 次
    - reFunc('[dn]ot{2}', 'dott', 'nott')
    
* '{M,N}' 表示出现 最少 M 次, 最多 N 次
    - reFunc('[dn]ot{1,2}', 'dot', 'not', 'dott', 'nott')
 

()

* 表达式分组
* 使用表达式分组可以分别获取每一个匹配到的子组

* 例:
    
    1、 reFunc('\d{3,4}-\d{7-8}', '010-7833033', '0539-7833033')
        
        执行结果:  
         res.group() # 010-7833033 0539-7833033
    
    2、reFunc('(\d{3,4})-(\d{7-8})', '010-7833033', '0539-7833033')      
    
        执行结果:  
        res.group()   # 010-7833033  0539-7833033
        res.group(0)  # 010-7833033  0539-7833033
        res.group(1)  # 010  0539
        res.group(2)  # 7833033 7833033

|

* 择一匹配符(有时候也称作 并 或者 逻辑或)

* re1 | re2 (匹配正则表达式 re1 或 re2  如: foo | bar)

* 例: 
    1、表达式: s1 = 'at | home' ( 匹配字符串 at, home )    
    2、reFunc('\w{4,20}@(163|qq|126)\.com', '[email protected]', '[email protected]', '[email protected]')

\num

(num 是具体数字)

* 引用分组 num 匹配到的字符串
* 使用这个符号要使用双 '\\1' 或 用元字符串 'r'

* 例:
    1、reFunc(r'(\d{3,4})-\1', '010-010')
       或
       reFunc('(\d{3,4})-\\1', '010-010')
    
    输出: 
    
        010-010
        
    2、reFunc('<(\w)+><(\w)+></\\2></\\1>', '<html><body></body></html>

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

* 给分组起别名 (P 是大写)

* 例:
    1、reFunc('<(?P<name1>\w+)><(?P<name2>\w+)></(?P=name2)></(?P=name1)>', '<html><body></body></html>

import re

def reFunc(restr,* args):

    for s in args:
        print(restr + ', ' + s)
        res = re.match(restr ,s)
        if res is not None:
            print 're result:' + res.group()
        else:
            print('result is None')


reFunc('<(?P<name1>\w+)><(?P<name2>\w+)></(?P=name2)></(?P=name1)>', '<html><body></body></html>')
import re

def reFunc(restr,* args):

    for s in args:
        print(restr + ', ' + s)
        res = re.match(restr ,s)
        if res is not None:
            print 're result:' + res.group()
        else:
            print('result is None')


reFunc('<(?P<name1>\w+)><(?P<name2>\w+)></(?P=name2)></(?P=name1)>', '<html><body></body></html>')

猜你喜欢

转载自blog.csdn.net/shihongji/article/details/81316637