Python正则笔记
点-匹配所有字符
.
表示要匹配除了换行符之外的任何单个字符。
content = '''苹果是绿色的
橙子是橙色的
香蕉是黄色的
乌鸦是黑色的'''
import re
p = re.compile(r'.色')
print(type(p))
for one in p.findall(content):
print(one)
'''
<class 're.Pattern'>
绿色
橙色
黄色
黑色
'''
星号-重复匹配任意次
*
表示匹配前面的子表达式任意次,包括0次。
content = '''苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的
猴子,'''
import re
p = re.compile(r',.*')
for one in p.findall(content):
print(one)
'''
,是绿色的
,是橙色的
,是黄色的
,是黑色的
,
'''
加号-重复匹配多次
+
表示匹配前面的子表达式一次或多次,不包括0次。
content = '''苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的
猴子,'''
import re
p = re.compile(r',.+')
for one in p.findall(content):
print(one)
'''
,是绿色的
,是橙色的
,是黄色的
,是黑色的
'''
问号-匹配0-1次
?
表示匹配前面的子表达式0次或1次。
content = '''苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的
猴子,'''
import re
p = re.compile(r',.?')
for one in p.findall(content):
print(one)
'''
,是
,是
,是
,是
,
'''
花括号-匹配指定次数
花括号表示前面的字符匹配指定的次数 。
content = '''红彤彤,绿油油,黑乎乎,绿油油油油'''
import re
p1 = re.compile(r'油{4}') # 匹配4次
p2 = re.compile(r'油{3,4}') # 匹配3到4次
for one in p1.findall(content):
print(one)
for one in p2.findall(content):
print(one)
'''
p1: 油油油油
p2: 油油油油
'''
贪婪模式和非贪婪模式
source = '<html><head><title>Title</title>'
import re
p1 = re.compile('<.*>') # 贪婪模式
p2 = re.compile('<.*?>') # 非贪婪模式
print(p1.findall(source)) # ['<html><head><title>Title</title>']
print(p2.findall(source)) # ['<html>', '<head>', '<title>', '</title>']
反斜杠
content = '''苹果.是绿色的
橙子.是橙色的
香蕉.是黄色的'''
import re
# 对元字符的转义
p1 = re.compile(r'.*\.')
for one in p1.findall(content):
print(one)
'''
苹果.
橙子.
香蕉.
'''
# 匹配某种字符类型
## \d匹配 - 匹配0-9之间任意一个数字字符
con1 = '111, 12345678912, 111'
p2 = re.compile(r'\d{11}')
print(p2.findall(con1)) # ['12345678912']
## \s匹配 - 匹配一个空白字符, 包括空格, tab, 换行符等
con2 = '111 ,111'
p3 = re.compile(r'111\s,')
print(p3.findall(con2)) # ['111 ,']
## \w匹配 - 匹配一个文字字符, 包括大小写字母, 数字, 下划线, 也包括unicode字符, 也可以指定ascll码标记
con3 = '''
苹果
orange
香蕉
'''
p4 = re.compile(r'\w{2,6}')
print(p4.findall(con3)) # ['苹果', 'orange', '香蕉']
p5 = re.compile(r'\w{2,6}', re.ASCII)
print(p5.findall(con3)) # ['orange']
## \D, \S, \W表示非
方括号-匹配几个字符之一
import re
cont1 = '''
王亚辉, 13500344799, 89
徐志摩, 1b900785634, 23
周根源, 15909875678, 44
周根源, 17909875678, 44
郝云摩, 05900785634, 23
李根源, 23909875678, 44
'''
p1 = re.compile(r'1[35]\d{9}') # 3, 5都可以
print(p1.findall(cont1)) # ['13500344799', '15909875678']
p2 = re.compile(r'1[3-7]\d{9}') # 3到7都可以
print(p2.findall(cont1)) # ['13500344799', '15909875678', '17909875678']
cont2 = 'a1b2c3d4e5'
p3 = re.compile(r'[^\d]') # 非数字可以
print(p3.findall(cont2)) # ['a', 'b', 'c', 'd', 'e']
起始、结尾位置 和 单行、多行模式
import re
cont1 = '''001-苹果价格-60
002-橙子价格-70
003-香蕉价格-80
'''
p1 = re.compile(r'^\d+')
p2 = re.compile(r'^\d+', re.MULTILINE)
print(p1.findall(cont1)) # ['001']
print(p2.findall(cont1)) # ['001', '002', '003']
p3 = re.compile(r'\d+$')
p4 = re.compile(r'\d+$', re.MULTILINE)
print(p3.findall(cont1)) # ['80']
print(p4.findall(cont1)) # ['60', '70', '80']
括号-分组
import re
cont1 = '''
苹果, 苹果是绿色的
橙子, 橙子是橙色的
香蕉, 香蕉是黄色的
'''
p1 = re.compile(r'(.*),')
print(p1.findall(cont1)) # ['苹果', '橙子', '香蕉']
p2 = re.compile(r'(.*)(,)')
print(p2.findall(cont1)) # [('苹果', ','), ('橙子', ','), ('香蕉', ',')]
cont2 = '''
张三, 手机号码15945678901
李四, 手机号码13945677701
王二, 手机号码13845666901
'''
p3 = re.compile(r'(.+),.*(\d{11})')
print(p3.findall(cont2)) # [('张三', '15945678901'), ('李四', '13945677701'), ('王二', '13845666901')]
split
import re
cont1 = '关羽; 张飞, 赵云, 马超, 黄忠 李逵'
p1 = re.split(r'[;,\s]\s*', cont1)
print(p1) # ['关羽', '张飞', '赵云', '马超', '黄忠', '李逵']
sub
import re
cont = '''
video/av66771949/?p=1
'''
# 匹配模式替换
p1 = re.sub(r'/av\d*/', '/cn345677/', cont)
print(p1) # video/cn345677/?p=1
# 指定替换函数
# 替换函数, 参数是Match对象
def subFunc(match):
# Match对象的group(0)返回的是整个匹配上的字符串
src = match.group(0);
# Match对象的group(1)返回的是第一个group分组的内容
number = int(match.group(1))+6
dest = f'/av{number}/'
print(f'{src}替换为{dest}', end='')
# 返回值就是最终替换的字符串
return dest
str = re.sub(r'/av(\d+)/', subFunc, cont)
print(str)
'''
/av66771949/替换为/av66771955/
video/av66771955/?p=1
'''
来源
白月黑羽. Python编程:正则表达式
白月黑羽. 教程网址