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()
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())
-------------------------------------------
个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~
本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!