正则

语法:re.findall(r'正则的规则','被匹配的对象')
一定要记熟下边的元字符
^a:以a开头的(只找开头),没有就返回空列表[]
A\((必须是\)在后边):以a结尾(只找结尾), 没有就返回空列表[]
\n,\t:找所有,有几个列几个

组:要是组的话用.group()
print(ret.group())

以下几个就是组:
findall():找所有,有几个列几个,列表形式,没有就是空列表
finditer():#组,找所有,放到迭代器里,一个一个取,没有就报错
search()#组,找所有,找到为止,没有报错
match()#组,只找开头,不是就停止查找,就报错

举个例子:

import re
ret = re.match(r'a','cbad')
print(ret.group())
ret = re.finditer(r'ab','abxcab')
print(ret.__next__().group())    #组
print(ret.__next__().group())    #组
for i in ret:
    print(i.group())

{a,b} 意思是前边内容出现m-n次范围 (ab必须挨着)
print(re.findall('a{2,4}b', 'ab aab aaab aacbaaabb'))

结果是: ['aab', 'aaab', 'aaab']
a?b 非贪婪的

print(re.findall('a?b','b ab aab abacdb aaaacb '))

结果是:['b', 'ab', 'ab', 'ab', 'b', 'b']

sub 替换 split 切割 complie

| 替换,"或"操作字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。 |

字符 说明
(abc) capture group,捕获组
\n backreference to group #n,分组引用,引用第 n 个捕获组匹配的内容, 其中 n 是正整数
(?:abc) non-capturing group,非捕获组

1.4 先行断言

字符 说明
a(?=b) positive lookahead,先行断言,a 只有在 b 前面才匹配
a(?!b) negative lookahead,先行否定断言,a 只有不在 b 前面才匹配

1.5 后行断言

字符 说明
(?<=b)a positive lookbehind,后行断言,a 只有在 b 后面才匹配
(?<!b)a negative lookbehind,后行否定断言,a 只有不在 b 后面才匹配

惰性匹配,就是尽可能少的匹配
以下都是惰性匹配:
{m,n}?
{m,}?
??
+?
*?

1.8 修饰符

字符 说明
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
u 开启"Unicode 模式",用来正确处理大于\uFFFF 的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。
s 允许 . 匹配换行符。
y y 修饰符的作用与 g 修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g 修饰符只要剩余位置中存在匹配就可,而 y 修饰符确保匹配必须从剩余的第一个位置开始,这也就是"粘连"的涵义

(a) <=> (a+)* <=> (a)+ <=> a
(a+)+ <=> a+

其他

re.I使匹配对大小写不敏感

re.L做本地化识别(locale-aware)匹配

re.M多行匹配,影响 ^ 和 $

re.S使 . 匹配包括换行在内的所有字符

re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.

re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

例 :邮箱的匹配

import re
d = re.findall(r'[0-9a-zA-Z_]{0,19}@163.com','232131121799qw@163.com213asdd@163.com')
print(1,d)  # ['232131121799qw@163.com', '213asdd@163.com']
或者
f = re.findall(r"[0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}.[com,cn,net]{1,3}", '232131121799qw@163.com213asdd@163.com')
print(f)

例子:

class PlatformLegalReplayVideoRemotePathConf(RemotePathConf):
"""
PlatformGeneratedMetaFileRemotePathConf
"""

_parser = re.compile(
    '(?P<platform_path>(?P<platform_bucket_name>[^/\s]+):(?P<key>(?P<tiered>[^/\s]+)/(?P<prefix>[^/\s]+)/source/'
    '(?P<data_type>[^/\s]+)/(?P<data_date>\d+)/(?P<vin>[^/\s]+)/(?P<task_id>[^/\s]+)/(?P<scenes_flag>[^/\s]+)/'
    'legal/replay_video/(?P<file_name>[^/\s]+)))'
)
_formatter = ('{platform_bucket_name}:{tiered}/{prefix}/source/{data_type}/{data_date}/{vin}/{task_id}/'
              '{scenes_flag}/legal/replay_video/{file_name}')

使用:
m3u8_path_info = {"task_id": "t123", "date": "20231001"}
m3u8_path = PlatformLegalReplayVideoRemotePathConf.format(m3u8_path_info)
m3u8_path_info = PlatformLegalReplayVideoRemotePathConf.parse(m3u8_path)

        #这两行代码的作用是先标准化 M3U8 视频文件的远程路径,并,并确保路径格式符合 PlatformLegalReplayVideoRemotePathConf 类定义的规范。通过 “格式化→解析” 的组合操作,验证并补充路径信息,保证后续使用时路径的完整性和正确性。
  1. m3u8_path = PlatformLegalReplayVideoRemotePathConf.format(m3u8_path_info)
    功能:根据 m3u8_path_info 中的字段信息,生成标准化的 M3U8 远程路径字符串。
    参数说明:
    PlatformLegalReplayVideoRemotePathConf:是一个路径配置类(类似之前解析的 PlatformGeneratedDirRemotePathConf),内部定义了路径的格式化模板(_formatter)。
    m3u8_path_info:一个字典(或包含特定字段的对象),包含生成路径所需的关键信息(如存储桶名、日期、任务 ID 等,具体字段由类的 _formatter 定义)。
    示例:
    若 _formatter 为 "{bucket}:{date}/{task_id}/replay.m3u8",且 m3u8_path_info = {"bucket": "my-bucket", "date": "20231001", "task_id": "t123"},则生成的 m3u8_path 为 my-bucket:20231001/t123/replay.m3u8。
  2. m3u8_path_info = PlatformLegalReplayVideoRemotePathConf.parse(m3u8_path)
    功能:将上一步生成的标准化路径 m3u8_path 重新解析为字段字典,验证路径格式的正确性,并可能补充额外信息。
    原理:类内部通过正则解析器(_parser)匹配路径字符串,提取命名分组(如 bucket、date、task_id 等),返回包含这些字段的字典。
    作用:
    验证格式:若 m3u8_path 不符合类定义的规范(如缺少字段、格式错误),解析会失败(可能抛出异常或返回空),从而提前发现路径生成问题。
    补充信息:解析过程可能会对提取的字段进行二次处理(如将 date 字符串转换为日期对象,或补充默认字段)。
    示例:
    对路径 my-bucket:20231001/t123/replay.m3u8 解析后,m3u8_path_info 会变回包含 {"bucket": "my-bucket", "date": "20231001", "task_id": "t123"} 等字段的字典。

组合操作的目的
这两行代码形成一个 “生成→验证→再提取” 的闭环,主要目的是:

确保路径格式正确:
通过 format 生成的路径可能因 m3u8_path_info 字段缺失或错误导致格式不规范,而 parse 操作会校验路径是否符合 _parser 定义的规则,若解析失败可及时发现问题。
补充完整字段信息:
有时 m3u8_path_info 可能只包含部分必要字段,format 生成路径时会使用默认值填充缺失字段,而 parse 可以将这些默认值提取出来,使 m3u8_path_info 包含完整的字段信息。
统一路径处理标准:
无论初始 m3u8_path_info 如何,经过 “格式化→解析” 后,最终的 m3u8_path_info 会严格遵循类定义的字段规范,便于后续模块统一处理。

应用场景示例:

# 初始信息(可能不完整)
m3u8_path_info = {"task_id": "t123", "date": "20231001"}

# 1. 生成标准化路径(使用类中定义的默认 bucket)
m3u8_path = PlatformLegalReplayVideoRemotePathConf.format(m3u8_path_info)
# 假设生成路径:"default-bucket:20231001/t123/replay.m3u8"

# 2. 解析路径,补充完整信息
m3u8_path_info = PlatformLegalReplayVideoRemotePathConf.parse(m3u8_path)
# 解析后得到完整字段:
# {"bucket": "default-bucket", "date": "20231001", "task_id": "t123", ...}

posted on 2020-02-26 18:38  xm微微一笑  阅读(141)  评论(0)    收藏  举报

导航