如何在Python中从大字符串提取<=左右两侧的所有值
提取字符串中
<=两侧的值 我来帮你搞定这个需求!要从这类Graphviz风格的决策树字符串里提取所有<=左右的内容,正则表达式是最直接高效的方式,下面是具体的实现方案:
解决思路
我们需要精准匹配的模式是:
- 左侧:类似
X[2]、X[0]的特征标识,格式为「字母+[数字]」 - 中间:可能带空格的
<=符号 - 右侧:整数或带小数点的数值
对应的正则表达式可以写成:(\w+\[\d+\])\s*<=\s*([\d.]+)
各部分的作用拆解:
(\w+\[\d+\]):专门捕获左侧的特征名,\w+匹配字母/下划线,\[\d+\]匹配[数字]的固定格式\s*:匹配0个或多个空格,用来兼容<=前后可能存在的空格<=\s*:匹配<=符号和它后面的空格([\d.]+):捕获右侧的数值,\d+匹配数字,\.匹配小数点,+表示至少出现一次
Python代码示例
import re # 你的示例字符串 input_str = '''node [shape=box] ; 0 [label="X[2] <= 17055.5\ngini = 0.0454\nsamples = 43\nvalue = [42, 1]"] ; 1 [label="gini = 0.0\nsamples = 1\nvalue = [0, 1]"] ; 0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ; 2 [label="gini = 0.0\nsamples = 42\nvalue = [42, 0]"] ; 0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] [label]="X[0] <= 5.41" ;''' # 执行正则匹配 pattern = r'(\w+\[\d+\])\s*<=\s*([\d.]+)' matches = re.findall(pattern, input_str) # 整理成你需要的分组结果 left_values = [match[0] for match in matches] right_values = [match[1] for match in matches] print("左侧值:", left_values) print("右侧值:", right_values)
运行结果
执行代码后会输出你想要的内容:
左侧值: ['X[2]', 'X[0]'] 右侧值: ['17055.5', '5.41']
扩展说明
如果你的字符串里还有其他格式的左侧内容(比如不带括号的变量名),可以调整正则表达式。比如如果左侧是任意非空白字符直到<=,可以把左侧捕获组改成([^\s"]+)(加上"是为了排除引号干扰),根据实际场景微调就能适配更多情况。
内容的提问来源于stack exchange,提问作者Ara
相关产品推荐
相关产品推荐

