如何提取python中的一部分字符串?
How to extract a part of the string in python?
我有以下列表:
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)']
我只想提取 MDSYS.SDO_POINT_TYPE 后方括号中包含数字的字符串。我该怎么做?
到目前为止我尝试了什么?
op=[]
for i in lst:
x = (i[46:56])
y = str('('+x+')')
op.append(y)
但是,数字并不总是在 46-56 的位置,我该如何优化它?
期望的输出:
['(9971, 1884)',
'(9971, 1918)',
'(9972, 1828)',
'(9977, 1920)',
'(9989, 1863)']
您可以使用正则表达式:
import re
>>> [re.findall("MDSYS.SDO_POINT_TYPE\((\d+, \d+)", s)[0] for s in lst]
['9971, 18847', '9971, 19188', '9972, 18282', '9977, 19201', '9989, 18635']
如果括号和NULL之间的数字可以在不同的位置,您可以使用模式首先获取捕获组中括号之间的值。
然后就可以找到第1组数值中的数字了
\bMDSYS\.SDO_POINT_TYPE\(([^()]+)\)
\bMDSYS\.SDO_POINT_TYPE\(
匹配 MDSYS\.SDO_POINT_TYPE(
([^()]+)
捕获 组 1 中括号内的所有内容
\)
比赛结束 )
看到一个Python demo ad a Regex demo
注意在期望的输出中,第二个值缺少最后一位。
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 = []
for s in lst:
m = re.search(r"\bMDSYS\.SDO_POINT_TYPE\(([^()]+)\)", s)
if m:
op.append("({})".format(", ".join(re.findall(r"\d+", m.group(1)))))
print(op)
输出
['(9971, 18847)', '(9971, 19188)', '(9972, 18282)', '(9977, 19201)', '(9989, 18635)']
我只是使用 split
将其分解为列表并再次与字符串组合
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)']
new_lst = []
for st in lst:
name,points = st.split('MDSYS.SDO_POINT_TYPE(')
f_num, s_num, *rest_ = points.split(',')
new_lst.append(f"({f_num},{s_num})")
print(new_lst)
我有以下列表:
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)']
我只想提取 MDSYS.SDO_POINT_TYPE 后方括号中包含数字的字符串。我该怎么做?
到目前为止我尝试了什么?
op=[]
for i in lst:
x = (i[46:56])
y = str('('+x+')')
op.append(y)
但是,数字并不总是在 46-56 的位置,我该如何优化它?
期望的输出:
['(9971, 1884)',
'(9971, 1918)',
'(9972, 1828)',
'(9977, 1920)',
'(9989, 1863)']
您可以使用正则表达式:
import re
>>> [re.findall("MDSYS.SDO_POINT_TYPE\((\d+, \d+)", s)[0] for s in lst]
['9971, 18847', '9971, 19188', '9972, 18282', '9977, 19201', '9989, 18635']
如果括号和NULL之间的数字可以在不同的位置,您可以使用模式首先获取捕获组中括号之间的值。
然后就可以找到第1组数值中的数字了
\bMDSYS\.SDO_POINT_TYPE\(([^()]+)\)
\bMDSYS\.SDO_POINT_TYPE\(
匹配MDSYS\.SDO_POINT_TYPE(
([^()]+)
捕获 组 1 中括号内的所有内容
\)
比赛结束)
看到一个Python demo ad a Regex demo
注意在期望的输出中,第二个值缺少最后一位。
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 = []
for s in lst:
m = re.search(r"\bMDSYS\.SDO_POINT_TYPE\(([^()]+)\)", s)
if m:
op.append("({})".format(", ".join(re.findall(r"\d+", m.group(1)))))
print(op)
输出
['(9971, 18847)', '(9971, 19188)', '(9972, 18282)', '(9977, 19201)', '(9989, 18635)']
我只是使用 split
将其分解为列表并再次与字符串组合
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)']
new_lst = []
for st in lst:
name,points = st.split('MDSYS.SDO_POINT_TYPE(')
f_num, s_num, *rest_ = points.split(',')
new_lst.append(f"({f_num},{s_num})")
print(new_lst)