使用Python Regex从坐标对中提取x和y

时间:2015-02-20 20:50:21

标签: python regex math

我如何使用正则表达式从(a,b)中提取a和b?

例如:

string = "(1,-5)"
string = "(0, \infty)"

然后输出将是:

x = 1
y = -5


x = 0
y = \infty

请注意,这不仅需要整数,还需要字符串。感谢。

5 个答案:

答案 0 :(得分:2)

您可以使用ast.literal_eval代替正则表达式:

>>> import ast
>>> my_string = "(1,-5)"
>>> x,y = ast.literal_eval(my_string)
>>> x
1
>>> y
-5

如果你打扰科学记谱法,那么是的,它会起作用:

>>> my_string = "(1.2e3,-5.56)"
>>> x,y = ast.literal_eval(my_string)
>>> x
1200.0
>>> y
-5.56

答案 1 :(得分:2)

使用正则表达式会很棘手,因为数字的语法可以包含非数字。例如,3.8e8是一个合法的号码,但有.e

>>> 3.8e8
380000000.0

这意味着\d的正则表达式不起作用:

>>> re.findall('\d','(1.2e3,4.5e6)')
['1', '2', '3', '4', '5', '6']

最好只是拆分逗号上的字符串,然后删除括号:

>>> def coords(string):
...   x, _, y = string.partition(',')
...   return x.lstrip('('), y.rstrip(')')
... 
>>> coords('(123,456)')
('123', '456')

当然,这也很脆弱,因为那里可能有空白等等。如果你没有具体说明什么,那么处理输入是很困难的。合法的,什么不是。

但是,如果您希望它是合法的Python输入,那么;最好只使用literal_eval,如another answer中所述。

答案 2 :(得分:1)

您可以使用re.findallmap功能:

>>> string = "(1,-5)"
>>> map(int,re.findall(r'-?\d',string))
[1, -5]

模式\d将匹配字符串中的任何数字!

答案 3 :(得分:1)

老笑话

  

有些人在面对问题时会思考   “我知道,我会使用正则表达式。”现在他们有两个问题。

我不建议使用正则表达式,我只是为了好玩而发布这个。

import re
matcher = re.compile('\(\s*([+-]?\d+(\.\d+(e[+-]?\d+)?)?)\s*,\s*([+-]?\d+(\.\d+(e[+-]?\d+)?)?)\s*\)')
result = matcher.match('(  +4.5e-4, -5.4e+4  )')
x = float(result.group(1)) #       0.00045
y = float(result.group(4)) #  -54000.0

PS。我喜欢Joshua Taylor发布的拆分和剥离解决方案。

答案 4 :(得分:0)

?表示0或1,\d表示数字,+表示一个或多个。 \.匹配点(因为.是一个没有反斜杠的特殊字符),*表示0或更多。

my_string = '(1,-52.42)'
x, y = re.findall(r'-?\d+\.?\d*', my_string)

print(x, y)