我有这个字符串:
-1007.88670550662*p**(-1.0) + 67293.8347365694*p**(-0.416543501823503)
但实际上我有很多像这样的字符串:
a*p**(-1.0) + b*p**(c)
其中a,b和c是双倍的。我想提取这个字符串的a,b和c。我怎么能用Python做到这一点?
答案 0 :(得分:3)
import re
s = '-1007.88670550662*p**(-1.0) + 67293.8347365694*p**(-0.416543501823503)'
pattern = r'-?\d+\.\d*'
a,_,b,c = re.findall(pattern,s)
print(a, b, c)
<强>输出强>
('-1007.88670550662', '67293.8347365694', '-0.416543501823503')
s
是你的测试字符串,不是,pattern
是正则表达式模式,我们正在寻找浮点数,一旦我们使用findall()
找到它们,我们将它们分配回{{ 1}},a
,b
请注意,只有当您的字符串采用您所提供的格式时,此方法才有效。否则你可以使用模式来匹配你想要的。
与评论中所述的大多数人一样编辑如果您需要在正数字前加c
,则可以使用此模式+
答案 1 :(得分:1)
使用reqular表达式
(-?\d+\.?\d*)\*p\*\*\(-1\.0\)\s*\+\s*(-?\d+\.?\d*)\*p\*\*\((-?\d+\.?\d*)\)
我们可以做到
import re
pat = r'(-?\d+\.?\d*)\*p\*\*\(-1\.0\)\s*\+\s*(-?\d+\.?\d*)\*p\*\*\((-?\d+\.?\d*)\)'
regex = re.compile(pat)
print(regex.findall('-1007.88670550662*p**(-1.0) + 67293.8347365694*p**(-0.416543501823503)'))
将打印[('-1007.88670550662', '67293.8347365694', '-0.416543501823503')]
答案 2 :(得分:1)
如果您的格式一致,并且您不想深入了解正则表达式(请查看regex101,btw)您可以通过它分开。
这是一个开始:
>>> s= "-1007.88670550662*p**(-1.0) + 67293.8347365694*p**(-0.416543501823503)"
>>> a, buf, c = s.split("*p**")
>>> b = buf.split()[-1]
>>> a,b,c
('-1007.88670550662', '67293.8347365694', '(-0.416543501823503)')
>>> [float(x.strip("()")) for x in (a,b,c)]
[-1007.88670550662, 67293.8347365694, -0.416543501823503]
答案 3 :(得分:1)
re
模块当然可以为此工作,尽管正如其他答案的一些评论所指出的那样,角落情况可能很有趣 - 小数点,加号和减号等等它可能更有趣;例如你的一个号码可以想象吗?
无论如何,如果你的字符串总是一个有效的Python表达式,你可以使用Python的内置工具来处理它。 Here is a good generic explanation关于ast模块的NodeVisitor
类。将它用于您的示例非常简单:
import ast
x = "-1007.88670550662*p**(-1.0) + 67293.8347365694*p**(-0.416543501823503)"
def getnums(s):
result = []
class GetNums(ast.NodeVisitor):
def visit_Num(self, node):
result.append(node.n)
def visit_UnaryOp(self, node):
if (isinstance(node.op, ast.USub) and
isinstance(node.operand, ast.Num)):
result.append(-node.operand.n)
else:
ast.NodeVisitor.generic_visit(self, node)
GetNums().visit(ast.parse(s))
return result
print(getnums(x))
这将返回一个包含表达式中所有数字的列表:
[-1007.88670550662, -1.0, 67293.8347365694, -0.416543501823503]
只有Python 3.x才需要visit_UnaryOp
方法。
答案 4 :(得分:0)
答案 5 :(得分:0)
虽然我更喜欢MooingRawr的答案,因为它很简单,我会稍微扩展它以涵盖更多情况。
浮点数可以转换为具有各种格式的字符串:
2.0e+07
).5
,等于0.5
)5.
,等于5
)+5
,等于5
)0
或5
)<强>脚本强>
import re
test_values = [
'-1007.88670550662*p**(-1.0) + 67293.8347365694*p**(-0.416543501823503)',
'-2.000e+07*p**(-1.0) + 1.23e+07*p**(-5e+07)',
'+2.*p**(-1.0) + -1.*p**(5)',
'0*p**(-1.0) + .123*p**(7.89)'
]
pattern = r'([-+]?\.?\d+\.?\d*(?:[eE][-+]?\d+)?)'
for value in test_values:
print("Test with '%s':" % value)
matches = re.findall(pattern, value)
del matches[1]
print(matches, end='\n\n')
<强>输出:强>
Test with '-1007.88670550662*p**(-1.0) + 67293.8347365694*p**(-0.416543501823503)':
['-1007.88670550662', '67293.8347365694', '-0.416543501823503']
Test with '-2.000e+07*p**(-1.0) + 1.23e+07*p**(-5e+07)':
['-2.000e+07', '1.23e+07', '-5e+07']
Test with '+2.*p**(-1.0) + -1.*p**(5)':
['+2.', '-1.', '5']
Test with '0*p**(-1.0) + .123*p**(7.89)':
['0', '.123', '7.89']