python 正则表达式


一、 re 模块用于对python的正则表达式的模式匹配

模式
描述
^ 匹配字符串的开头。
$ 匹配字符串的末尾。
. 匹配任意字符除了换行符当re.DOTALL标记被指定时则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出[amk] 匹配 'a''m'或'k'。
[^...] 不在[]中的字符[^abc] 匹配除了a,b,c之外的字符。
* 匹配0个或多个的表达式。
+ 匹配1个或多个的表达式。
? 匹配0个或1个由前面的正则表达式定义的片段非贪婪方式。
{ n} 精确匹配n个前面表达式。
{ n, } 匹配n到无穷次由前面正则表达式定义的片段贪婪方式。
{n,m} 匹配 n 到 m 次由前面的正则表达式定义的片段贪婪方式。
a|b 匹配a或b。
(re) G匹配括号内的表达式也表示一个组
(?imx) 正则表达式包含三种可选标志i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (...), 但是不表示一个组。
(?imx: re) 在括号中使用i, m, 或 x 可选标志。
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志。

(?#...) 注释。
(?= re) 前向肯定界定符。如果所含正则表达式以 ... 表示在当前位置成功匹配时成功否则失败。但一旦所含表达式已经尝试匹配引擎根本没有提高模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反当所含表达式不能在字符串当前位置匹配时成功。
(?> re) 匹配的独立模式省去回溯。
\w 匹配字母数字。
\W 匹配非字母数字。
\s 匹配任意空白字符等价于 [\t\n\r\f].。
\S 匹配任意非空字符。
\d 匹配任意数字等价于 [0-9]。
\D 匹配任意非数字。
\A 匹配字符串开始。
\Z 匹配字符串结束如果是存在换行只匹配到换行前的结束字符串。
\z 匹配字符串结束。
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界也就是指单词和空格间的位置。例如 'er\b' 可以匹配"never" 中的 'er'但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'但不能匹配 "never" 中的 'er'。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。
\1...\9 匹配第n个分组的子表达式。
\10 匹配第n个分组的子表达式如果它经匹配。否则指的是八进制字符码的表达式。


二、 语法:

    import re 导入模块名

        p=re.compile("^[0-9]")  #生成要匹配的正则对象  ^代表从开头匹配[0-9]代表

    匹配0至9的任意一个数字 所以这里的意思是对传进来的字符串进行匹配如果这个字符串的开

    头第一个字符是数字就代表匹配上了

         =p.match('14534Abc')   #按上面生成的正则对象 去匹配 字符串 如果能匹配成

    功这个m就会有值 否则m为None   if m: #不为空代表匹配上了

        上面也可以合起来写=p.match("^[0-9]",'14534Abc')

        效果是一样的区别在于第一种方式是提前对要匹配的格式进行了编译对匹配公式进行解析这样再去匹

        配的时候就不用在编译匹配的格式第2种简写是每次匹配的时候 都 要进行一次匹配公式的编译所以如果你需

        要从一个5w行的文件中匹配出所有以数字开头的行建议先把正则公式进行编译再匹配这样速度会快点。


三、 re 模块下 match 、search 、findall 、sub、split、group() 和      groups()方法


    match #从字符串开头开始匹配匹配到一个即退出


        >>> re.match(".","abc123def")

        <_sre.SRE_Match object; span=(0, 1), match='a'>

        >>> re.match(".","abc123def").group()

        'a'

    

    search # 匹配整个字符串直到找到一个匹配

        >>> re.search("\d+","abc123def456upq").group()  # 取第一组符合的数字

        '123'


    findall # 找到所有要匹配的字符并返回列表格式

        >>> re.findall("\d+","abc123def456upq")        #  取所有数字

        ['123', '456']

        >>> re.findall("[^\d+]","abc123def456upq_jdh*jde345dfs")       # 取反

        ['a', 'b', 'c', 'd', 'e', 'f', 'u', 'p', 'q', '_', 'j', 'd', 'h', '*', 

                        'j', 'd', 'e', 'd', 'f', 's']


    sub #替换匹配的字符串

        >>> print(re.sub('\d+','|','sad45323sab$3@#24.7c_234',count=2))

        sad|sab$|@#24.7c_234


    split # 将匹配到的格式当做分割点对字符串分割成列表

        >>> tent

        "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'"

        >>> re.split('\*',tent)

        ["'1 - 2 ", ' ((60-30+1', '(9-2', '5/3+7/3', '99/4', '2998+10', '568/14))

                         -(-4', '3)/(16-3', "2) )'"]

        >>> re.split('\*',tent,2)  # 其中的2 表示用前连个匹配到的表达式作为分隔符

        ['1 - 2 ', ' ((60-30+1', '(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )']


    group() 和 groups()   # 以分组形式进行显示


        >>> a = "123abc456"

        >>> print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group())

        123abc456

        >>> print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0))

        123abc456

        >>> print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1))

        123

        >>> print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2))

        abc

        >>> print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups())

        ('123', 'abc', '456')


re.match与re.search的区别

                re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而       re.search匹配整个字符串,直到找到一个匹配。

        >>> ret = re.match("\d+","abc123def456upq")

        >>> print(ret)

        None

        >>> ret = re.search("\d+","abc123def456upq").group()

        >>> print(ret)

        123


四、几个常见的正则的例子:


    1. 匹配手机号

        phone_str = "my name is allen,my phone number is 13651054607, please call me !"

        m = re.search("(1)([358]\d{9})",phone_str)

        if m:

            print(m.group())


    2. 匹配ip:

       import re

ip="inet addr:192.168.117.10  Bcast:192.168.117.20  Mask:255.255.255.12"

res = re.findall("(?

ret = re.findall("((25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})",ip)

for i in ret:

   print(i[0])


    3. 匹配email:

        >>> email = '[email protected],[email protected]'

        >>> m = re.search(r'[0-9_.a-z]{0,26}@[0-9a-z]{0,20}.[a-z]{3}',email)

        >>> print(m.group())

        [email protected]

        >>> email = '139.com,[email protected],abc123'

        >>> m = re.search(r'[0-9_.a-z]{0,26}@[0-9a-z]{0,20}.[a-z]{3}',email)

        >>> print(m.group())

        [email protected]