在re.split之后,如何将分隔符放回去?

时间:2017-09-21 07:00:16

标签: python algorithm python-3.x

以下代码拆分方程式并在对其进行排序后进行组装。

def simplify(poly):
    import re
    p=re.split('\+|\-',poly)
    return '+'.join(sorted(''.join(sorted(x)) for x in p))
print(simplify('a+ca-ab'))

问题:对它们进行排序并不难,但很难将操作员(+, - )放回去,上​​面的代码只能放回' +&#39 ;但不是' - '回到等式中。

我可以问一下如何将操作员放回去?

2 个答案:

答案 0 :(得分:2)

请注意,您的函数名称不适合代码。你只是试图按字典顺序对未知数进行排序。

如果你将未知数和它们的符号分开,处理就会变得一团糟。只需要一起处理它们:

import re

pattern = re.compile('[+-]?[a-z]+', re.I)

def ignore_sign(s):
    return re.sub('[+-]', '', s)

def simplify(poly):
    if poly[0] not in '+-':
        poly = '+' + poly
    parts = [''.join(sorted(part)) for part in re.findall(pattern, poly)]
    sorted_parts = sorted(parts, key=ignore_sign)
    return re.sub('^\+', '', ''.join(sorted_parts))

print(simplify('a-ac+ba'))
# a+ab-ac

字符串前加+以避免将未知数混合在一起(感谢@rici):

print(simplify('z-ac+ba'))
# ab-ac+z

对零件进行排序时,您只需忽略任何标记,以便在-a之前显示+z

>>> sorted(['-a', '+z'])
['+z', '-a']
>>> sorted(['-a', '+z'], key=ignore_sign)
['-a', '+z']

答案 1 :(得分:0)

试试这个逻辑。它不会删除拆分字符,将其与列表元素保持一致。

import re
def simplify(poly):
    original_p = re.split('(\+|\-)',poly)
    without_operand = [x for x in original_p if x not in ["+", "-"]]
    return "".join(original_p)
print(simplify('a+ca-ab'))