1.re模块与正则表达式之间的关系
正则表达式不少python独有的,它是一门独立的技术。所有的编程语言都可以使用正则表达式,但是如果你想在python中使用,你就必须依赖于re模块。
2.字符
字符: |
|
元字符 |
匹配内容 |
. |
匹配除换行符以外的任意字符 |
w |
匹配字母或数字或下划线 |
W |
匹配非字母或数字或下划线 |
s |
匹配任意的空白符 |
S |
匹配非空白符 |
d |
匹配数字 |
D |
匹配非数字 |
|
匹配一个换行符 |
|
匹配一个制表符 |
|
匹配一个单词的结尾 |
^ |
匹配字符串的开始 (类似于startswith) |
$ |
匹配字符串的结尾 (类似于endswith) |
^与$连用,会精确限制匹配的内容,两者中间写什么,就是什么字符 |
|
a|b |
匹配字符a或字符b(把长的写在前面) |
() |
匹配括号内的表达式,也表示一个组 |
[…] |
匹配字符组中的字符 |
[^…] |
匹配除了字符组中字符的所有字符(取反) |
3.量词
(1)量词必须跟在正则符号的后面
(2)量词只能够限制住紧挨着它的那一个正则符号
正则表达式在匹配的时候默认为贪婪模式(即尽量匹配多的),可以通过在量词后面加一个? ,就可以将贪婪匹配变成非贪婪匹配(即惰性匹配)。
量词: |
|
量词 |
用法说明 |
* |
重复零次或更多次 |
+ |
重复一次或更多次 |
? |
重复零次或一次 |
{n} |
重复n次 |
{n,} |
重复n次或更多次 |
{n,m} |
重复n到m次 |
(.*?)的用法
# . 是任意字符 # * 是取0至无线长度 # ? 是非贪婪模式 # 组合在一起就是指:取尽量少的任意字符,一般用于:.*?x # 意思是取前面任意长度的字符,直到一个x出现
4.re模块下的常用方法
import re ret = re.findall('a','apple,age,add')#返回所有满足匹配条件的结果,放在列表里 print(ret) #>>>:['a', 'a', 'a'] # 函数会在字符串内通过查找模式匹配,直到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 ret = re.match('a','apple,age,add').group() # 同search,不过尽在字符串开始处进行匹配 print(ret) #>>>:a ret = re.split('[ab]','acbcd') # 先按'a'分割得到''和'cbcd',在对''和'cbcd'分别按'b'分割 print(ret) >>>:['', 'c', 'cd'] ret = re.sub('d','H','ead5fkaj3fas6h',2)#将数字替换成'H',参数2表示只替换2个数字 print(ret) >>>:eadHfkajHfas6h ret = re.subn('d', 'H', 'eva3e2gon4yua2n4')#将数字替换成'H',返回元组(替换的结果,替换的次数) print(ret) >>>:('('evaHeHgonHyuaHnH', 5) obj = re.compile('d{3}')#将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个l连续的数字 ret = obj.search('abcd1234ajf')#正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) >>>:123
(1).findall的优先级
import re ret= re.findall('www.(baidu|kugou).com','www.kugou.com') print(ret)#findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 >>>:['kugou'] ret= re.findall('www.(?:baidu|kugou).com','www.kugou.com') print(ret)#findall >>>:['www.kugou.com']
(2)split的优先级查询
import re ret = re.split('d+','abcd12e34f') print(ret) >>>:['abcd', 'e', 'f'] ret = re.split('(d+)','abcd12e34f') print(ret) >>>:['abcd', '12', 'e', '34', 'f'] # 在匹配部分加上()之后所切出的结果是不同的,没有()的就没有保留所匹配的项,
# 但是有括号的却能够保留了匹配的项,这个在某些需要保留匹配部分的使用过程是非常重要的。
(3) search与match的异同点
import re ret = re.search('a','pplae age hard') print(ret)# search不会给你直接返回匹配到的结果,而是给你返回一个对象 >>>:<_sre.SRE_Match object; span=(3, 4), match='a'> print(ret.group())# 必须调用group才能看到匹配的结果 >>>:a #注意:1.search只会依据正则查找一次,只要查到了结果,就不会再往后查找 2.当查找的结果不存在的情况下,调用group直接报错
import re ret = re.match('a','pplae age hard') print(ret) print(ret.group()) >>>:None # 注意:1.match只会匹配字符串的开头部分。 2.当字符串的开头不符合匹配规则的情况下,返回的也是None,此时如果再调用group也会报错。