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编程:正则表达式
白月黑羽. 教程网址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y_cen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值