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

Posted 小a玖拾柒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()) 

以上是关于Python学习---重点模块之re的主要内容,如果未能解决你的问题,请参考以下文章

python3+ 模块学习 之 re

python 正则表达式 (重点) re模块

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

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

Python之常用模块学习

正则表达式学习(python之re模块)