You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码说明

  1. 正则模式解析:
    • MDSYS\.SDO_POINT_TYPE\(:精准匹配目标前缀(.在正则中是特殊字符,需要用\转义)
    • (\d+):匹配第一个连续数字序列,并用括号标记为可提取的分组
    • ,\s*:匹配逗号和任意数量的空格,兼容不同格式的空格缩进
    • (\d+):匹配第二个连续数字序列,同样标记为分组
  2. 数字截断:按照你给出的期望输出,我们把第二个完整数字截取了前四位(比如18847变成1884),如果不需要截断,直接使用num2_full即可。
  3. 鲁棒性:不管前面的字符串长度如何变化,只要目标格式不变,就能正确提取数字,不会像切片那样因为位置偏移出错。

运行这段代码后,就能得到你期望的输出:
['(9971, 1884)', '(9971, 1918)', '(9972, 1828)', '(9977, 1920)', '(9989, 1863)']

内容的提问来源于stack exchange,提问作者disukumo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:37:45