如何用正则表达式提取比较运算符前后的标签与数值?
正确提取标签与数值的实现方案
嘿,我来帮你搞定这个提取问题!你的需求是从包含比较条件的字符串里,分别提取运算符前的标签列表和运算符后的数值列表,之前的正则表达式没能正确覆盖所有情况,下面给你两种可靠的实现方式:
方法一:正则分组匹配(推荐)
这种方式通过正则的分组功能,一次性匹配出每个条件里的标签、运算符和数值,逻辑清晰且能处理运算符前后空格不一致的情况,还兼容中文顿号的分隔:
import re # 你的输入字符串 input_str = "aa1 !=5、bb1 >=1、cc1 ==1、dd2 <= 2、e3 <2" # 正则模式:分组匹配标签、运算符、数值 # - 第一个分组 ([a-zA-Z0-9_]+):匹配标签(字母、数字、下划线组成) # - \s*:匹配运算符前后的任意空格(包括0个) # - 第二个分组 ([!=<>]=?):匹配所有比较运算符(!=、>=、==、<=、<、>) # - 第三个分组 (\d+):匹配数值(数字) pattern = r'([a-zA-Z0-9_]+)\s*([!=<>]=?)\s*(\d+)' matches = re.findall(pattern, input_str) # 分别提取标签和数值 tags = [item[0] for item in matches] values = [item[2] for item in matches] print("标签列表:", tags) # 输出: ['aa1', 'bb1', 'cc1', 'dd2', 'e3'] print("数值列表:", values) # 输出: ['5', '1', '1', '2', '2']
方法二:拆分条件逐个处理
如果觉得正则有点抽象,也可以先把整个字符串按中文顿号分割成单个条件,再对每个条件拆分出标签和数值:
input_str = "aa1 !=5、bb1 >=1、cc1 ==1、dd2 <= 2、e3 <2" conditions = input_str.split('、') tags = [] values = [] # 定义所有可能的比较运算符,按长度从长到短排序(避免短运算符先匹配,比如先匹配=再匹配==) operators = ['!=', '>=', '<=', '==', '>', '<'] for cond in conditions: for op in operators: if op in cond: tag, val = cond.split(op) tags.append(tag.strip()) values.append(val.strip()) break print("标签列表:", tags) # 输出: ['aa1', 'bb1', 'cc1', 'dd2', 'e3'] print("数值列表:", values) # 输出: ['5', '1', '1', '2', '2']
为什么之前的正则无效?
你之前写的正则[a-zA-Z0-9_.]* ? (?(!=|==|<=|>=|>|<)\=)逻辑过于复杂,且只针对包含=的运算符,漏掉了单独的<或>,同时没有处理中文顿号分隔和空格的问题,所以无法正确提取所有内容。
内容的提问来源于stack exchange,提问作者Arulanand Nagarajan
相关产品推荐
相关产品推荐

