Python用正则提取比较运算符后的值并判断其数据类型
原有代码匹配失效的核心原因
- 核心正则逻辑缺陷:编写的正则规则
([<>]=?|==)(\d+)仅支持捕获运算符后的纯数字值,完全覆盖不到带单/双引号包裹的字符串值场景,碰到jeeps =='one'这类字符串表达式时自然返回空匹配结果 - 拆分逻辑冗余:按
and拆分表达式的操作没有做格式清洗,运算符两侧的多余空格会干扰后续匹配逻辑 - 结果结构偏差:循环过程中直接把findall返回的嵌套元组列表append到结果集,最终输出结构是多层嵌套列表,和预期的扁平化值列表
['20','one']结构不一致
调整后的实现方案
直接通过全局正则匹配的方式解析整段表达式,无需手动拆分and/or逻辑块,同时兼容两类取值场景,自动识别值类型:
- 规则同时匹配比较运算符后的两类内容:单/双引号包裹的字符串、不带引号的整数/浮点数
- 匹配过程自动跳过运算符两侧的多余空格,兼容
==前后带空格的书写格式 - 匹配结果自动做类型判断:引号内的内容标记为字符串类型,纯数字内容自动转成int/float类型
可直接运行的示例代码
import re def extract_op_values(express_str): # 正则匹配规则支持带空格的运算符、带引号的字符串、纯数字三类场景 match_pattern = r'(>=|<=|==|!=|[<>])\s*(?:([\'"])(.*?)\2|(-?\d+(?:\.\d+)?))' values = [] type_marks = [] for res in re.finditer(match_pattern, express_str): _, quote, str_content, num_content = res.groups() # 处理引号包裹的字符串值 if str_content is not None: values.append(str_content) type_marks.append(type(str_content).__name__) # 处理纯数字值 if num_content is not None: val = float(num_content) if '.' in num_content else int(num_content) values.append(val) type_marks.append(type(val).__name__) return values, type_marks # 对目标测试串做提取 test_str = "cars>=20 and jeeps =='one'" pure_values, val_types = extract_op_values(test_str) print(pure_values) # 输出 [20, 'one'],和预期结果一致 print(val_types) # 输出 ['int', 'str'],自动完成类型判断
方案适配效果
- 针对原有测试字符串,最终可直接输出预期的扁平化值列表,不会出现空匹配的问题
- 支持识别
>=、<=、==、!=、>、<全类比较运算符 - 兼容表达式中运算符两侧带空格、引号包裹的字符串带任意特殊字符的场景,不需要手动split拆分逻辑块
内容的提问来源于stack exchange,提问作者sree
相关产品推荐
相关产品推荐

