正则工具 - ReUtil¶
由来¶
Python 内置的 re 模块功能强大,但使用起来较为繁琐。ReUtil 封装了常用的正则操作,提供更简洁的 API。
方法¶
匹配¶
from hutool import ReUtil
# 判断是否匹配
ReUtil.is_match(r"\d+", "123") # True
ReUtil.contains(r"\d+", "abc123") # True
# 提取匹配内容
ReUtil.get(r"\d+", "abc123def") # "123"
ReUtil.get(r"(\d+)", "abc123def", 1) # "123"(指定分组)
# 获取所有匹配
ReUtil.get_all(r"\d+", "a1b2c3") # ["1", "2", "3"]
替换¶
# 替换所有匹配
ReUtil.replace_all("a1b2c3", r"\d+", "x") # "axbxcx"
# 替换第一个匹配
ReUtil.replace_first("a1b2c3", r"\d+", "x") # "axb2c3"
# 删除所有匹配
ReUtil.del_all(r"\d+", "a1b2c3") # "abc"
提取与分割¶
# 提取(使用模板)
ReUtil.extract(r"(\d+)-(\d+)", "2024-01", "$1年$2月") # "2024年01月"
# 分割
ReUtil.split("a,b,,c", r",") # ["a", "b", "", "c"]
# 统计匹配次数
ReUtil.count(r"\d+", "a1b2c3") # 3
转义¶
# 转义正则特殊字符
ReUtil.escape("[hello]") # "\\[hello\\]"
查找与位置¶
# 查找所有匹配
ReUtil.find_all(r"\d+", "a1b2c3") # ["1", "2", "3"]
ReUtil.find_all_group0(r"\d+", "a1b2c3") # ["1", "2", "3"](等价于 find_all)
ReUtil.find_all_group1(r"(\d)(\d)", "12 34") # ["2", "4"](捕获组1)
# 查找第一个数字
ReUtil.find_first_number("abc123def") # "123"
# 匹配位置
ReUtil.index_of(r"\d+", "abc123") # 3(第一个匹配的起始位置)
ReUtil.last_index_of(r"\d+", "a1b2c3") # 4(最后一个匹配的起始位置)
删除匹配¶
# 删除第一个/最后一个匹配
ReUtil.del_first(r"\d+", "a1b2c3") # "ab2c3"
ReUtil.del_last(r"\d+", "a1b2c3") # "a1b2c"
# 删除匹配之前的内容
ReUtil.del_pre(r"\d+", "abc123def") # "123def"
# 提取并删除
ReUtil.extract_multi_and_del_pre(r"\d+", "abc123def456", 0)
# ("123", "def456")
其他¶
# 获取命名捕获组
ReUtil.get_all_group_names(r"(?P<year>\d{4})-(?P<month>\d{2})")
# {"year": 1, "month": 2}
# 正则替换 + 回调函数
ReUtil.replace_by_func("hello123", r"\d+", lambda m: "[NUM]")
# "hello[NUM]"
模式匹配¶
# findFirstPattern — 按优先级查找第一个匹配的模式
ReUtil.find_first_pattern("abc123", [r"\d+", r"[a-z]+"]) # r"\d+"
ReUtil.find_first_pattern("!!!", [r"\d+", r"[a-z]+"]) # None
# findAllPatterns — 查找所有匹配的模式
ReUtil.find_all_patterns("Hello123", [r"\d+", r"[a-z]+", r"[A-Z]+"])
# [r"\d+", r"[a-z]+", r"[A-Z]+"]