对正则表达式的运用总是不熟练, 每次要写正则的时候,总是傻傻分不清 * . ?+()区别了。
这次特意系统学习,并做个笔记吧
一、正则表达式的常用操作符
操作符 | 说明 | 栗子 |
---|---|---|
. | 表示任意单个字符 | |
[ ] | 字符集,对单个字符给出取值范围 | [abc]: 表示a或b或c; [a-z]: 表示a到z |
[^ ] | 非字符集,对单个字符给出排除范围 | [^abc]: 表示非a或b或c单的单个字符 |
* | 表示*号前一个字符0次或无限次扩展(最小0次, 最大无限次) | abc*: 表示ab、abc、abcc、abccc |
+ | 表示+号的前一个字符1次或无限次扩展(最小至少1次, 最大无限次) | abc+: 表示abc、abcc、abccc、abcccc |
? | 表示?前一个字符可以是0次或1次扩展(只能是0次 或 最多1次) | abc?: 表示ab、abc |
| | 左右任意表达式1个 | abc|def: 表示 abc 或 def |
{m} | 扩展前一个字符m次 | abc{2}: 表示abcc |
{m, n} | 扩展前一个字符m次到n次 | abc{1, 3}: 表示abc 、abcc、 abccc |
^ | 匹配字符串开头 | |
$ | 匹配字符串结尾 | |
() | 分组标记, 多组时内部只能用|操作符 | (abc)表示abc; (abc|efg): 表示abc或efg |
\w | 单词字符,等价[a-zA-Z0-9] | |
\W | 用于匹配所有与\w不匹配的字符 | |
\d | 数字, 等价于[0-9] | |
\s | 空格 | |
\S | 非空格 | |
[\u4e00-\u9fa5] | 匹配中文字符 |
二、Row string类型
如:正则表达式 ^\d+$, 用row string类型表示,为re = r'^\d+$'; 但是如果用string类型表示,需要对\进行转义,为re = r'^\\d+$';
由此可见,当正则表达式中包含转义符时,建议使用row string类型表示更方便。
三、Re库6个主要功能函数
re.search() 、re.match()、re.findall()、re.split()、re.finditer()、re.sub()
import re
# search 可以匹配到, 结果:111901 (注意:只会返回一个匹配结果,如果希望返回所有匹配结果, 需要使用finditer 或 findall)
search = re.search(r'[1-9]\d{5}', 'BAT 111901 IUC333777')
if search:
print(search.group(0))
# match
# match = re.match(r'[1-9]\d{5}', 'BAT 111901') 从头开始匹配,所以匹配不到
# 可以匹配到了, 结果:111901
match = re.match(r'[1-9]\d{5}', '111901 BAT')
if match:
print(search.group(0))
else:
print("匹配不到")
# findall 结果:['111901', '888999']
list = re.findall(r'[1-9]\d{5}', '111901 BAT 888999')
if list:
print(list)
else:
print("匹配不到")
# split 结果:['', ' BAT ', '']
s = re.split(r'[1-9]\d{5}', '111901 BAT 888999')
if s:
print(s)
else:
print("匹配不到")
# finditer: 返回的是迭代类型, 结果111901、888999
for fi in re.finditer(r'[1-9]\d{5}', '111901 BAT 888999'):
if fi:
print(fi.group(0))
# sub 满足正则条件的部分,都被给定的内容替换. 结果:啊哈 BAT 啊哈
sb = re.sub(r'[1-9]\d{5}', '啊哈', '111901 BAT 888999')
print(sb)
以上这些函数, 还可以先通过re.compile(pattern) 对正则表达式先编译, 然后使用编译后的正则对象调用这些方法,这种方式因为是一次编译,多次使用, 效率更高。