Bootstrap

正则表达式---火星文计算

题目描述
已知火星人使用的运算符为#、$,其与地球人的等价公式如下:

x#y = 4x+3y+2
xKaTeX parse error: Expected 'EOF', got '#' at position 48: …C语言规则计算 火星人公式中,#̲的优先级高于,相同的运算符,按从左到右的顺序计算
现有一段火星人的字符串报文,请你来翻译并计算结果。

输入描述
火星人字符串表达式(结尾不带回车换行)

输入的字符串说明: 字符串为仅由无符号整数和操作符(#、$)组成的计算表达式。例如:

123#4$5#67$78

用例保证字符串中,操作数与操作符之间没有任何分隔符。

用例保证操作数取值范围为32位无符号整数。

保证输入以及计算结果不会出现整型溢出。

保证输入的字符串为合法的求值报文,例如:123#4$5#67$78

保证不会出现非法的求值报文,例如类似这样字符串:

#4$5 //缺少操作数

4$5# //缺少操作数

4#$5 //缺少操作数

4 $5 //有空格

3+4-5*6/7 //有其它操作符

12345678987654321$54321 //32位整数计算溢出

输出描述
根据输入的火星人字符串输出计算结果(结尾不带回车换行)

用例1
输入
7#6$5#12
输出
157
说明
7#6$5#12

=(47+36+2)$5#12

=48$5#12

=48$(45+312+2)

=48$58

=2*48+58+3

=157

import re
s = input()
def getresult(s):
    # 定义正则表达式模式匹配数字,#和数字
    p = re.compile('(\\d+)#(\\d+)')
    while True:
        m = p.search(s) # 在字符串s中查找匹配的模式
        if m:
            subs = m.group()#获取匹配到的完整字符串(例如 "12#34")
            x = int(m.group(1))
            y = int(m.group(2))
            #  # 将匹配项替换为计算结果,这里是 4 * x + 3 * y + 2
            s = s.replace(subs,str(4*x+3*y+2),1)# 只替换第一个匹配
        else:
            break
    # 将字符串以"$"为分割符划分,得到一个字符串列表,然后转为整数列表
    arr = list(map(int,s.split('$')))
    x = arr[0]# 取第一个元素作为初始值 x
    for y in arr[1:]:
        x = 2*x+y+3
    return x
print(getresult(s))

;