Python中提取字符串指定部分的方法:SDO_GEOMETRY列表中MDSYS.SDO_POINT_TYPE坐标子串优化提取
用正则表达式解决位置不固定的提取问题
你的切片方法依赖固定字符位置,一旦字符串结构有细微变化(比如前面的内容长度改变)就会失效。用正则表达式匹配模式才是更可靠的方案——它能精准定位到MDSYS.SDO_POINT_TYPE后面括号里的数字,完全不受前置内容长度的影响。
优化后的代码
import re lst = ['SDO_GEOMETRY(2001, NULL, MDSYS.SDO_POINT_TYPE(9971, 18847, NULL), NULL, NULL)', 'SDO_GEOMETRY(2001, NULL, MDSYS.SDO_POINT_TYPE(9971, 19188, NULL), NULL, NULL)', 'SDO_GEOMETRY(2001, NULL, MDSYS.SDO_POINT_TYPE(9972, 18282, NULL), NULL, NULL)', 'SDO_GEOMETRY(2001, NULL, MDSYS.SDO_POINT_TYPE(9977, 19201, NULL), NULL, NULL)', 'SDO_GEOMETRY(2001, NULL, MDSYS.SDO_POINT_TYPE(9989, 18635, NULL), NULL, NULL)'] op = [] # 正则模式:精准匹配目标前缀,捕获后面的两个数字 pattern = r'MDSYS\.SDO_POINT_TYPE\((\d+),\s*(\d+)' for item in lst: match_result = re.search(pattern, item) if match_result: # 获取两个数字分组 num1, num2_full = match_result.groups() # 按照你的期望截取第二个数字的前四位 num2 = num2_full[:4] op.append(f'({num1}, {num2})') else: # 可选:处理匹配失败的异常情况 op.append(None) print(op)
代码说明
- 正则模式解析:
MDSYS\.SDO_POINT_TYPE\(:精准匹配目标前缀(.在正则中是特殊字符,需要用\转义)(\d+):匹配第一个连续数字序列,并用括号标记为可提取的分组,\s*:匹配逗号和任意数量的空格,兼容不同格式的空格缩进(\d+):匹配第二个连续数字序列,同样标记为分组
- 数字截断:按照你给出的期望输出,我们把第二个完整数字截取了前四位(比如
18847变成1884),如果不需要截断,直接使用num2_full即可。 - 鲁棒性:不管前面的字符串长度如何变化,只要目标格式不变,就能正确提取数字,不会像切片那样因为位置偏移出错。
运行这段代码后,就能得到你期望的输出:['(9971, 1884)', '(9971, 1918)', '(9972, 1828)', '(9977, 1920)', '(9989, 1863)']
内容的提问来源于stack exchange,提问作者disukumo
相关产品推荐
相关产品推荐

