Python学习---重点模块之re

正则表达式是用来操作字符串,但是字符串提供的正则是完全匹配,有时候我们需要进行模糊匹配,这个时候就需要正则表达式了。通过re模块来实现,由C语言来执行底层的匹配


    字符匹配(普通字符,元字符):


        1 普通字符:大多数字符和字母都会和自身匹配
                  2 元字符:. ^ $ * + ? { } [ ] | ( ) \  
            . :  通配符,[注意,点不能匹配换行符,且只代表一位字符]
              ^ :  匹配以什么为开始的字符
              $:  匹配以什么为结尾的字符
              *:  [0,  +00],重复匹配任意位
              +:  [1,  +00],至少有一位
            ?:  [0,  1],出现0次或者1次
              (): 分组,在findall()匹配的时候,只返回分组里面的内容
           {m,n}:出现m到n次
            [a-z]: 出现a-z的任意字符,而且取消元字符的特殊功能,而且^代表取反的效果
            [^g]: 取出不是g开头的字符
             \: 消除元字符特殊含义; 与特殊字母有特殊功能
            \d  匹配任何十进制数;它相当于类 [0-9]。
            \D 匹配任何非数字字符;它相当于类 [^0-9]。
            \s  匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
            \S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
            \w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
            \W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
            \b  匹配一个特殊字符边界,比如空格 ,&,#等   

re.findall(): 返回所有结果,返回到一个列表里面

import re
print(re.findall('\d', 'hello123world'))         # ['1', '2', '3']
print(re.findall('\d+', 'hello123world'))        # ['123']
print(re.findall('w\w{2}ld', 'hello123world'))   # ['world']
print(re.findall('w..d', 'hello123world'))       # []  匹配失败,因为匹配个数不同
print(re.findall('w...d', 'hello123wo\nld'))     # []  匹配失败,因为不匹配换行符
print('hello123wo\tld')                          # hello123wo  ld
print(re.findall('w...d', 'hello123wo\tld'))     # ['wo\tld']
print(re.findall('w...d', 'hello123world'))      # ['world'],一个点只能匹配且只能任意一个字符[不能匹配换行符]
print(re.findall('^h...o', 'hello123world'))     # 匹配以h开头的字符,['hello']
print(re.findall('d$', 'hello123world'))         # 匹配以d结尾的字符,['d']
print(re.findall('.*d', 'hello123world'))        # 匹配任意字符到d结束,['hello123world']
print(re.findall('hel+o', 'hello123world'))      # 匹配任意至少一个l字符到o结束,['hello']
print(re.findall('a?b', 'aaaabbhabafb'))         # ['ab', 'b', 'ab', 'b']
print(re.findall('a{1,6}b', 'aaaabbhabafb'))     # ['aaaab', 'ab']
print(re.findall('[g,m]od', 'god'))              # ['god']
print(re.findall('[g,m]od', 'mod'))              # ['mod']
print(re.findall('[a-z]','helloworld'))          # ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
print(re.findall('[a-z,*]','hell*'))            # ['h', 'e', 'l', 'l', '*'],取消元字符特殊含义
print(re.findall('[1-9a-zA-Z]', 'he73wo'))       # ['h', 'e', '7', '3', 'w', 'o']
print(re.findall('[1-9, a-z, A-Z]', 'he73wo'))   # ['h', 'e', '7', '3', 'w', 'o']
print(re.findall('[^ab]', '45bdhab3'))           # ['4', '5', 'd', 'h', '3']
print(re.findall('[^ab]', '45bdh"ab"3'))         # ['4', '5', 'd', 'h', '"', '"', '3']
print(re.findall('a[bc]d', 'abcd'))         # [], 仅能匹配一个
print(re.findall('a[b,c]d', 'abcd'))         # [], 仅能匹配一个
print(re.findall(r'(ad)+', 'adad'))              # ['ad']
print(re.findall('www.(\w+)', 'www.baidu.com'))  # ['baidu']分组后,仅仅打印分组里面的内容
print(re.findall('www.(?:\w+).com', 'www.baidu.com')) # ['www.baidu.com'] 取消分组优先级打印分组内容 
关于斜杠的特殊说明:我们输入的\,再解释器解释的时候就是\\
                   re里面的\和python里面的\都有特殊意义,所以需要2次的解释,所以4个\
# print(re.findall('\\\', 'hell\oworld'))         #  错误
print(re.findall('\\\\', 'hell\oworld'))           #  ['\\'] 
# print(re.findall(r'\', 'hell\oworld'))          #  错误
print(re.findall(r'\\', 'hell\oworld'))            #  ['\\']
print(re.search(r'\bblow', 'blow').group())        # blow, 边界查找

re.search():  函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以

通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None

import re
print(re.search('sb', 'hellosbworldsb').group())   # sb

re.match(): 只在字符串开始匹配; 返回一个对象,利用group()输出结果

import re
print(re.match('\d+', 'hell123'))                  # 匹配失败,只在开始匹配
print(re.match('\d+', '123helwo').group())         # 返回一个对象,利用group()打印

re.split(): 先根据第一个标准切割,然后在此基础上进行第二次切割,同时还可以指定切割次数

如果要切割的字符在首字母,默认前面有一个空格,所以会切个出来一个空

import re
print('stsrongtr'.split('t'))   # ['s', 'srong', 'r']
print('stsrongtr'.split('s'))   # ['', 't', 'rongtr']
print(re.split('s', 'strongstr')) # ['', 'trong', 'tr']
print(re.split('[s,t]', 'stsrongtr')) # ['', '', 'rong', '', 'r']  先根据s进行切分,后根据t对s切割的切分
print(re.split('[s,t]', 'stsrongtr', 2)) # ['', '', 'srongtr']  首字母切割

re.sub():字符串替换

import re
print(re.sub('\d+', ' ', 'hello123world'))   # hello world

re.compile()

image

import re
com = re.compile('\d+')
print(com.findall('hello123world'))    # 调用com里面的findall()方法

re.finditer(): 返回一个迭代器对象,利用next()和group()取出值

import re
ret = re.finditer('\d+', 'hello123wo456rld') 
print(ret)      # <callable_iterator object at 0x00000000007D40F0>
print(next(ret).group())
print(next(ret).group()) 
posted @ 2018-07-28 20:40  小a玖拾柒  阅读(249)  评论(0编辑  收藏  举报