一、前言
日常文本处理场景中,经常需要从一段句子里筛选出符合特定格式的编号、物料码、零件编码:
- 同时包含字母 + 数字、仅由字母数字组成、长度 2~8 位的混合编码;
- 纯数字、位数严格在 4~7 位的数字编号;
本文基于 python 内置re正则库,封装通用筛选函数,搭配多组测试用例完整演示,附带正则语法拆解、样本匹配判断、运行结果,新手也能直接复制使用。
二、完整可运行源码
import re
def process_string(input_string):
"""
从输入文本中筛选符合规则的单词片段
匹配规则二选一:
1. 同时包含字母+数字,仅由字母数字构成,长度2~8位
2. 纯数字,总位数4~7位
:param input_string: 输入带空格分隔的文本
:return: 所有符合规则的字符串列表
"""
result_list = []
# 按空格切割文本,拆分出独立单词
word_parts = input_string.split()
# 正则1:匹配字母+数字混合编码,长度2~8,无特殊符号
pattern_mix = re.compile(r'(?=.*[a-za-z])(?=.*\d)[a-za-z\d]{2,8}$')
# 正则2:匹配4~7位纯数字
pattern_num = re.compile(r'^\d{4,7}$')
# 遍历每一个拆分后的单词,校验规则
for word in word_parts:
if pattern_mix.match(word) or pattern_num.match(word):
result_list.append(word)
return result_list
# 测试样本集
test_texts = [
'aceite p04476',
'sdighsg',
's4967xl',
'v0-4985',
'shfsf v0-4985',
'123',
'1234568956',
'45825'
]
# 批量提取所有符合规则的编码
total_result = []
for text in test_texts:
match_words = process_string(text)
total_result.extend(match_words)
# 输出最终筛选结果
print("所有匹配成功的编码:", total_result)
三、代码分层详解
3.1 核心函数process_string逻辑
- 文本分割:
split()以空格分割整段文字,把一句话拆成独立单词,单独校验每个单词; - 双正则匹配规则:设置两套正则,满足任意一条即判定为有效编码;
- 循环校验收集:遍历所有单词,匹配成功存入列表,最后返回筛选结果。
3.2 两条正则表达式深度拆解
正则 1:r'(?=.*[a-za-z])(?=.*\d)[a-za-z\d]{2,8}$'
用于匹配字母数字混合编码
表格
| 正则片段 | 作用说明 |
|---|---|
(?=.*[a-za-z]) | 正向预查:字符串必须包含至少 1 个大小写字母 |
(?=.*\d) | 正向预查:字符串必须包含至少 1 个数字 |
[a-za-z\d]{2,8} | 整体仅允许字母、数字,总长度限制 2~8 位 |
^ $ | 匹配单词首尾,严格限制整个单词不能包含-、_等特殊符号 |
关键限制:带横杠、点、下划线的字符串直接过滤,例如v0-4985因存在-无法匹配。
正则 2:r'^\d{4,7}$'
用于匹配纯数字编号
表格
| 正则片段 | 作用说明 |
|---|---|
^ | 匹配字符串开头 |
\d{4,7} | 只能是数字,长度最少 4 位、最多 7 位 |
$ | 匹配字符串结尾 |
边界规则:3 位数字、8 位及以上数字都会直接过滤。
3.3 批量测试逻辑
- 把多段待检测文本统一放入列表循环;
- 每段文本调用筛选函数,得到当前文本匹配结果;
extend()将单次结果合并到总列表,一次性收集全部有效编码;- 打印汇总后的最终结果。
四、测试样本逐个匹配分析
表格
| 测试文本 | 拆分单词 | 是否匹配 | 匹配原因 / 过滤原因 |
|---|---|---|---|
| aceite p04476 | aceite、p04476 | p04476 ✅ | 字母 + 数字混合,长度 6,符合正则 1 |
| sdighsg | sdighsg | ❌ | 只有字母,无数字 |
| s4967xl | s4967xl | ✅ | 字母数字混合,长度 7,符合正则 1 |
| v0-4985 | v0-4985 | ❌ | 包含特殊符号-,正则仅允许字母数字 |
| shfsf v0-4985 | shfsf、v0-4985 | ❌ | 含减号,无符合规则单词 |
| 123 | 123 | ❌ | 纯数字仅 3 位,低于 4 位下限 |
| 1234568956 | 1234568956 | ❌ | 纯数字 10 位,超出 7 位上限 |
| 45825 | 45825 | ✅ | 纯数字 5 位,4~7 区间,符合正则 2 |
五、程序运行输出
plaintext
所有匹配成功的编码: ['p04476', 's4967xl', '45825']
六、拓展优化方向(可直接修改代码)
6.1 支持带横杠的编码(如 v0-4985)
修改混合正则,允许-符号:
pattern_mix = re.compile(r'(?=.*[a-za-z])(?=.*\d)[a-za-z\d\-]{2,10}$')6.2 修改数字长度范围
需要匹配 3~10 位纯数字,修改正则:
pattern_num = re.compile(r'^\d{3,10}$')
6.3 支持逗号 / 顿号分割文本
分割逻辑替换,兼容多分隔符:
# 同时按空格、逗号分割 word_parts = re.split(r'[ ,]', input_string)
七、适用场景
- 工业文本提取零件号、物料编码;
- 日志文本筛选设备编号、订单短号;
- ocr 识别文字后过滤有效编码;
- 表单文本批量清洗提取目标字段。
八、知识点总结
re.compile()预编译正则,多次调用效率更高;match()从字符串开头完整匹配,适合校验整个单词;- 正向预查
(?=...)实现 “同时包含字母 + 数字” 的复合条件; split()/re.split()灵活分割文本,拆分独立关键词;- 多规则正则使用
or并联,满足任意一条即可命中。
以上就是python使用正则提取混合字母数字/指定长度纯数字字符串的完整案例的详细内容,更多关于python正则提取数字和字符串的资料请关注代码网其它相关文章!
发表评论