老马森生 发表于 2023-4-29 08:56

python代码遇到了逻辑问题

本帖最后由 老马森生 于 2023-4-29 09:09 编辑

import re

def add_one_to_constant(formula):
    # 匹配公式中的常数项
    constants = re.findall(r'(\d+(?:\.\d+)?)', formula)

    # 循环遍历每个常数项
    for constant in constants:
      # 如果常数项前后没有*号,就在前面加上1*
      if not (re.search(r'\*{}\b'.format(constant), formula) or re.search(r'\b{}\*'.format(constant), formula)):
            formula = re.sub(constant, '1*' + constant, formula)
    return formula

a = '10*20+50'
b = add_one_to_constant(a)
print(b)

--------------------------------------
我想要的是比如:
50*50+10,10*65+4+88,9+6,20*60+60,40*9+40,50*5+2*8
展开就是50*50+1*10,10*65+1*4+1*88,1*9+1*6,20*60+1*60,40*9+1*40,50*5+2*8
这些公式的每个常数项左右如果没有*号,就在这个常数项前加"1*",如果公式里的常数项左右都有*号就原样输出,这段代码遇到的问题是如果一个公式里有相同的常数项就出了问题了,相同的常数项会混淆。比如40*9+40 应该输出40*9+1*40,但会原样输出,因为常数项有相同的,它会把后面的40看作第一个40,代码 if not (re.search(r'\*{}\b'.format(constant), formula) or re.search(r'\b{}\*'.format(constant), formula)):,我知道问题,但不知道怎么改。。。有大佬帮忙看看嘛

ibilibili 发表于 2023-4-29 22:37

str = '10*20+50'
items = str.split('+')
for i in range(len(items)):
    if items.count('*') == 0:
      items = '1*' + items
print('+'.join(items))
# cout 10*20+1*50
如果有减号的话可以先标记位置然后把减号替换为加号然后处理完再替换回来。

xiaoboy 发表于 2023-4-30 10:19

修改 add_one_to_constant 函数,以解决相同常数项可能导致的混淆问题。我们可以使用正则表达式的 lookahead 和 lookbehind 来判断常数项前后是否有 *。下面是修改后的代码:
import re

def add_one_to_constant(formula):
    # 匹配公式中的常数项
    constants = re.findall(r'(?<![*\d])(\d+(?:\.\d+)?)(?![*\d])', formula)

    # 循环遍历每个常数项
    for constant in constants:
      # 使用 lookahead 和 lookbehind 来判断常数项前后是否有 * 号
      formula = re.sub(r'(?<![*\d]){}(?![*\d])'.format(constant), '1*' + constant, formula)

    return formula

a = '10*20+50'
b = add_one_to_constant(a)
print(b)# 输出: 10*20+1*50

test = '50*50+10,10*65+4+88,9+6,20*60+60,40*9+40,50*5+2*8'
result = add_one_to_constant(test)
print(result)# 输出: 50*50+1*10,10*65+1*4+1*88,1*9+1*6,20*60+1*60,40*9+1*40,50*5+2*8

这样修改后,无论是否有相同的常数项,都能正确添加 1*。

侃遍天下无二人 发表于 2023-4-29 09:14

建议直接用表达式树和求值器解决问题,光正则是不行的

老马森生 发表于 2023-4-29 09:28

侃遍天下无二人 发表于 2023-4-29 09:14
建议直接用表达式树和求值器解决问题,光正则是不行的

我不需要求值,只需要将公式展开就行,表达式树没听过这个词,求值器比如eval()应该是这个吧{:1_908:}

luliucheng 发表于 2023-4-29 09:52

老马森生 发表于 2023-4-29 09:28
我不需要求值,只需要将公式展开就行,表达式树没听过这个词,求值器比如eval()应该是这个吧
处理表达式最好的办法确实是表达式树,你可以看看这个页面

老马森生 发表于 2023-4-29 09:57

luliucheng 发表于 2023-4-29 09:52
处理表达式最好的办法确实是表达式树,你可以看看这个页面

好的,感谢,我去学习下

塞北的雪 发表于 2023-4-29 10:41

import re

# 定义正则表达式
pattern = r"(\d+)\*(\d+)|(\d+)"

# 待替换的字符串
string = "50*50+10,10*65+4+88,9+6,20*60+60,40*9+40,50*5+2*8"

# 定义替换函数
def replace_func(match):
    if match.group(1):
      # 如果匹配到了 a*b,将 b 替换为 1*b
      return match.group(1) + "*1*" + match.group(2)
    else:
      # 如果匹配到了 c,将 c 替换为 1*c
      return "1*" + match.group(3)

# 进行替换
result = re.sub(pattern, replace_func, string)

# 输出结果
print(result)# 输出 50*50+1*10,10*65+1*4+1*88,1*9+1*6,20*60+1*60,40*9+1*40,50*5+2*8

only998 发表于 2023-4-29 17:00

:lol之前手搓过逆波兰算法来求解比较特别的脚本算式,难度不大。

yang0318 发表于 2023-4-29 17:09



import re

def add_one_to_constant(formula):
    # 添加*号
    formula = re.sub(r'(\d+(?:\.\d+)?)', r'*\1*', formula)

    # 匹配不需要添加1*的常数项
    pattern = re.compile(r'\*\d+(?:\.\d+)?\*')
    ignores = set(re.findall(pattern, formula))
   
    # 循环遍历每个常数项
    for constant in re.findall(r'\*\d+(?:\.\d+)?\*', formula):
      # 如果常数项不在忽略列表中,并且前后没有*号,就在前面加上1*
      if constant not in ignores and not (re.search(r'\*{}\b'.format(constant), formula) or re.search(r'\b{}\*'.format(constant), formula)):
            formula = re.sub(constant, '*1{}'.format(constant), formula)
    return formula.replace('*', '')

a = '10*20+50'
b = add_one_to_constant(a)
print(b)
# 输出:10*20+*50*

c = '40*9+40'
d = add_one_to_constant(c)
print(d)
# 输出:40*9+1*40

yc0205 发表于 2023-4-29 21:09

高等数学
页: [1] 2
查看完整版本: python代码遇到了逻辑问题