我如何使用正则表达式从(a,b)中提取a和b?
例如:
string = "(1,-5)"
string = "(0, \infty)"
然后输出将是:
x = 1
y = -5
x = 0
y = \infty
请注意,这不仅需要整数,还需要字符串。感谢。
答案 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.findall
和map
功能:
>>> 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)