Python学习笔记04#正则表达式
本文记录学习中用到了的正则表达式的特点,很多知识点是自己的理解感悟,表述得不一定严谨
目录
首先
import re
1.search()方法
-
re.search(pattern,string)
基础例子re.search(r'me','i am me')
#re.search会搜索第一个符合条件的并返回
返回<re.Match object; span=(5, 7), match='me'>
-
regex.search(string[,pos[,endpos]])# 编译后对象的search方法,使用re.compile(pattern)来获得regex
基础例子rx.search(string,0,5)
#从0开始,到5结束,注意这里不再有模式,因为这是已编译对象的方法
2.使用[ ]来创建字符类
>>> re.search(r'[aeiou]','I love you')
<re.Match object; span=(3, 4), match='o'>
- [ ] 中的所有元素只要在后面任何一个有出现,就会被查找出来返回
- [ ] 中范围用-连接,如[1-5]
3.{ }表示重复次数
>>> re.search(r'ab{4}c','abbbbc')
<re.Match object; span=(0, 6), match='abbbbc'>
- { }中范围用‘,‘连接,如{1,5}
4.一个略微复杂的正则表达式
原本目的是搜索所有0-255的数,然而代码只能实现000-255
>>> re.search(r'[01]\d\d|2[0-5][0-5]','265 356 066 008')
<re.Match object; span=(8, 11), match='066'>
- 正则表达式匹配的是字符串,就数字来说只有0-9
- | 是或的意思,\d是任意数字(0-9)的意思
5.正则表达式使用的特殊符号和字符
记号 | 说明 | 举例说明 |
---|---|---|
. | 匹配任意单个字符,除了换行符 | |
^ | 匹配字符串的开始 | ^abc |
[^…] | 不匹配此字符集中出现的任何字符 | [^a-z] |
$ | 匹配字符串的结尾 | abc$ |
* | 匹配前面的正则表达式0次或多次 | [a-z]* |
+ | 匹配前面的正则表达式1次或多次 | [a-z]+ |
? | 匹配前面的正则表达式0次或1次 | [a-z]? |
特殊字符 | 说明 | 举例说明 |
\w | 匹配任何数字和字母字符 | |
\s | 匹配任何空白符 | |
\b | 匹配单词边界 | \bthe 任何以“the”开始的字符串 \bthe\b 仅匹配单词“the” |
\c | 取消特殊字符c的特殊含义,按字面匹配 | . \ * |
6.findall()方法
- re.findall(pattern,string)#findall和search的区别:findall会返回一个列表,findall会搜索所有符合条件的字符串
- 基本例子
>>> re.findall('car','carry the barcardi to the car')
['car', 'car', 'car']
注意:
如果模式里带有1个括号,对于一个满足模式的对象,其输出的内容就是括号匹配到的内容(匹配还是按照整个模式来匹配,只是输出不同),而不是整个表达式所匹配到的结果。
如果模式里是括号套括号的形式,对于一个满足模式的对象,其输出内容会先输出外面的括号内(即整个内容)所匹配到的内容作为一个元组里的一个元素,再输出里面的括号内所匹配到的内容作为另一个元素,以此类推。这整个元组会作为返回列表中的一个项。
如果模式里有多个括号并列,对于一个满足模式的对象,其输出内容就是分别将各个括号里匹配到得内容作为一个元组里的各个元素,这整个元组会作为返回列表中的一个项。
其实这些问题的核心规律是:先寻找符合整体模式的对象,作为列表中的项。对于某一个对象,再对括号按照从外往里的优先级判断,每满足条件即作为列表中一项中的一个元素
示例:
re.findall(r'abc(def)','abcdef abcdef abc def')
['def', 'def']
re.findall(r'(abc(def))','abcdef abcdef abc def')
[('abcdef', 'def'), ('abcdef', 'def')]
re.findall(r'(abc)(def)','abcdef abcdef abc def')
[('abc', 'def'), ('abc', 'def')]
7.sub()和subn()方法
re.sub(模式,用来替换的字符串,待检测字符串)
基础例子
>>> re.sub('X','mr.smith','attn:X\n\nDear X,\n')
'attn:mr.smith\n\nDear mr.smith,\n'
re.subn()#与re.sub()的区别是这个会多返回一个表示替换次数的数字
基础例子
>>> re.subn('X','mr.smith','attn:X\n\nDear X,\n')
('attn:mr.smith\n\nDear mr.smith,\n', 2)
8.split()方法
re.split(分割模式,待分割字符串)
按分割模式分割字符串,将分割后的各个子字符串作为一个列表中的项返回
基础例子
filename = re.split('/','//wx4.sinaimg.cn/mw600/0076BSS5ly8grdfc67g6lj30u00jzq4x.jpg')[-1]
>>> filename
'0076BSS5ly8grdfc67g6lj30u00jzq4x.jpg'