Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从字符串中提取坐标_Python_Regex_String - Fatal编程技术网

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一个解决方案可能工作得很好,但另一个可能工作得更好。为什么不在你的数据上测试一下,然后选择一个最适合你的。哇,你回答得太快了。很高兴知道,但我目前正在使用浮动。谢谢你!