如何提取字符串的一部分

时间:2017-04-21 15:47:35

标签: python string python-2.7 python-3.x split

我有这个字符串:

-1007.88670550662*p**(-1.0) + 67293.8347365694*p**(-0.416543501823503)

但实际上我有很多像这样的字符串:

a*p**(-1.0) + b*p**(c)

其中a,b和c是双倍的。我想提取这个字符串的a,b和c。我怎么能用Python做到这一点?

6 个答案:

答案 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}},ab

请注意,只有当您的字符串采用您所提供的格式时,此方法才有效。否则你可以使用模式来匹配你想要的。

与评论中所述的大多数人一样编辑如果您需要在正数字前加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)

您可以使用以下内容:

import re
a,_,b,c = re.findall(r"[\d\-.]+", subject)
print(a,b,c)

Demo

答案 5 :(得分:0)

虽然我更喜欢MooingRawr的答案,因为它很简单,我会稍微扩展它以涵盖更多情况。

浮点数可以转换为具有各种格式的字符串:

  • 指数格式(例如2.0e+07
  • 没有前导数字(例如.5,等于0.5
  • 没有尾随数字(例如。5.,等于5
  • 带加号的正数(例如+5,等于5
  • 没有小数部分的数字(整数)(例如05

<强>脚本

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']