如何在python中从字符串中提取数字

如何在python中从字符串中提取数字,python,regex,Python,Regex,我有一系列坐标,如下所示 str='(707.027,949.189),(598.919,6.48649)' 我想提取这些值,但是括号变得很难解决。我尝试了以下方法: str.split(",") which gives ['(707.027', '949.189)', '(598.919', '6.48649)'] str.split(",\(\)") which gives ['(707.027,949.189),(598.919,6.48649)'] 您的字符串是有效的Python文本

我有一系列坐标,如下所示

str='(707.027,949.189),(598.919,6.48649)'
我想提取这些值,但是括号变得很难解决。我尝试了以下方法:

str.split(",") which gives ['(707.027', '949.189)', '(598.919', '6.48649)']
str.split(",\(\)") which gives ['(707.027,949.189),(598.919,6.48649)']

您的字符串是有效的Python文本,请尝试:

>>来自ast导入文字\u eval
>>>s='(707.027949.189),(598.919,6.48649)'
>>>文字评估
((707.027, 949.189), (598.919, 6.48649))

这将
s
解析为Python代码,并对其进行求值(安全地,作为一个文本值),生成一个元组。

Python内置函数
eval
可以做到这一点,它将字符串解析为代码

>>s='(707.027949.189),(598.919,6.48649)'
>>>评估(s)
((707.027, 949.189), (598.919, 6.48649))

给定字符串,您也可以使用这种更通用的方法:

import re
s = '(707.027,949.189),(598.919,6.48649)'
nums = re.findall('\d*\.\d*',s)
nums #['707.027', '949.189', '598.919', '6.48649']
这将从任何字符串中去掉所有浮点数。然后您可以使用它们执行任何操作,即将它们放入元组:

coords = list(zip(nums[::2],nums[1::2]))
coords #[('707.027', '949.189'), ('598.919', '6.48649')]

尽管在这种情况下可以使用
eval
,但这通常不是处理此类数据的安全方法,尤其是当您试图解释的字符串不在代码中或您自己输入时

根据您的要求,这里有一个使用regex的解决方案:

import re

subject = '(707.027,949.189),(598.919,6.48649)'
match = re.search(r"\(([\d.]+),([\d.]+)\),\(([\d.]+),([\d.]+)\)", subject)

numbers = []
p1, p2 = tuple(), tuple()
if match:
    numbers = [float(match.group(n)) for n in range(1, 5)]
    # or
    p1 = (float(match.group(1)), float(match.group(2)))
    p2 = (float(match.group(3)), float(match.group(4)))

print(numbers, p1, p2)

尝试在
[^\d.]+
上拆分,或者只使用
[\d.]+
查找所有的
是否总是以这种形式?如果是这样,第一个解决方案应该可以工作。如果不是这样,那么findall将无法与[\d.]+一起工作。谢谢,酷!这正是我需要的。谢谢。这是一个简洁的解决方案,但您可能希望将这些字符串转换为浮点数。然后,在提取它们后,映射或转换为浮点数…这种方法的目的是为了更通用,而不是简单地计算字符串,而字符串恰好是以允许这种方式的格式