Python 从字符串中提取坐标
考虑以下内容:Python 从字符串中提取坐标,python,regex,string,Python,Regex,String,考虑以下内容:“多重限制((10,10,40)、(40,30,30,40,20,30-10))” 我想把它转换成:[[10,10],[10,40],[40,40],[30,30],[40,20],[30,10] 我的解决方案 我使用函数split()和replace()对其进行格式化。我得到一些脏代码,可能不是最有效的,比如my_str.split('(')[1].split(')')[1]…等等 因为我是在一个巨大的数据集上进行这项工作的,所以我正在寻找一种有效的方法来完成这项工作。您可以使用
“多重限制((10,10,40)、(40,30,30,40,20,30-10))”
我想把它转换成:
[[10,10],[10,40],[40,40],[30,30],[40,20],[30,10]
我的解决方案我使用函数
split()
和replace()
对其进行格式化。我得到一些脏代码,可能不是最有效的,比如my_str.split('(')[1].split(')')[1]…等等
因为我是在一个巨大的数据集上进行这项工作的,所以我正在寻找一种有效的方法来完成这项工作。您可以使用re
:
import re
s = 'MULTILINESTRING((10 10,10 40),(40 40,30 30,40 20,30 10))'
final_result = list(filter(None, [list(map(int, i.split())) for i in re.findall('[\d\s]+', s)]))
输出:
[[10, 10], [10, 40], [40, 40], [30, 30], [40, 20], [30, 10]]
如果您正在寻找没有太多功能的干净代码,我建议使用两步流程,包括re
模块-
使用str.split
对于每个区块,使用re.findall
为了提高性能,我建议使用re.compile
预编译正则表达式模式,因为我们将在循环中重复调用它
>>> import re
>>> p = re.compile(r'\d+(?:\.\d+)?')
>>> [list(map(int, p.findall(x)) for x in mstring.split(',')]
[[10, 10], [10, 40], [40, 40], [30, 30], [40, 20], [30, 10]]
注意,mstring
是您的字符串数据
详细信息
\d+ # match one or more digits
(?: # specify non-capturing group
\. # literal period/decimal
\d+
)? # optional
从语义上讲,这个正则表达式将匹配整数或浮点(Ajax1234的解决方案目前只考虑整数,并保证在更少的周期内完成搜索)。工作正常,我只需要删除数组中的第一个空单元格。“谢谢你。”纳赞很乐意帮忙。请查看我最近的编辑,因为我添加了一种从结果中删除空列表的方法。现在编辑之后,情况看起来更糟。我高度怀疑这将是更可读或比OP目前有更好的@Nazan,如果你坚持的话,你可以考虑把它分解成多行,或者看我的答案。ᴏʟᴅsᴘᴇᴇᴅ 不,原来的确实工作得很好,但似乎OP遇到了从他的数据集生成的空列表。这个更新的解决方案处理空列表。是的,但是您迭代了re.findall,我迭代了str.split。谢谢。我将您的解决方案和@Ajax1234解决方案结合起来,以获得更好的解决方案。@Nazan不,这应该是独立的。它是否按原样处理您自己的数据?除非您知道自己在做什么,否则我不建议将这两个答案结合起来。@Ajax1234的解决方案运行良好。但正如您所说,“我建议使用re.compile预编译正则表达式模式,因为我们将在循环中重复调用它。”Ajax没有做到这一点。@Nazan一个解决方案可能工作得很好,但另一个可能工作得更好。为什么不在你的数据上测试一下,然后选择一个最适合你的。哇,你回答得太快了。很高兴知道,但我目前正在使用浮动。谢谢你!