首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法隔离字符串元素以转换和完成加法

无法隔离字符串元素以转换和完成加法
EN

Stack Overflow用户
提问于 2020-11-14 13:53:01
回答 3查看 49关注 0票数 0

我得到了一个example.txt文件,其中包含:

代码语言:javascript
运行
复制
4-1
9-3

作为书面格式,字符串类型。我需要打开文件,读取行,执行操作并重写文件,以便:

代码语言:javascript
运行
复制
4-1=3
9-3=6

但是在尝试转换时,我经常会遇到一个错误,我认为问题是-符号,它不会删除它,当我做f.readlines来得到它,就像列表中有['4-1\n', '9-3\n']。我设法剥去了\n符号。

到目前为止我的代码是:

代码语言:javascript
运行
复制
with open('./izrazi.txt', 'r+') as f:
    lst = f.readlines()
    print(lst)
    first = lst[0]
    first = first.strip('\n')
    print(first)
    print(first.isdigit())

我试图转换为set,然后删除-,然后我将它转换回list,只有2个元素,但是每次运行代码之后,它们都会更改索引位置,因此我无法减去。

EN

回答 3

Stack Overflow用户

发布于 2020-11-14 14:15:28

eval在行上执行数学操作。

代码语言:javascript
运行
复制
with open('./izrazi.txt', 'r+') as f:
    lst = f.readlines()
    [f.write(i.strip('\n') + '=' + str(eval(i)) + '\n') for i in lst]
票数 0
EN

Stack Overflow用户

发布于 2020-11-14 14:15:45

我想..。像这样的事情会做好你的工作。

代码语言:javascript
运行
复制
f = open('./izrazi.txt', 'r+')
text = f.readlines()
f.close()
f = open('./izrazi.txt', 'w+')
for line in text:
    res=eval(line)
    out=line.strip('\n') + '=' + str(res) + '\n'
    f.write(out)
f.close()
票数 0
EN

Stack Overflow用户

发布于 2020-11-14 15:28:06

eval()肯定会做到这一点,但是有一个school of thought是最好避免使用eval()的,所以我将介绍一个使用正则表达式的替代方法。

尝试使用像split()这样的Python函数变得非常困难,因为您只能在一个字符上拆分。正则表达式将使您能够更容易地找到方程的组成部分。例如,这个正则表达式:

代码语言:javascript
运行
复制
r'(\d+\.?\d*)([\-+/*])(\d+\.?\d*)'

专门查找三个组(括号内):

(\d+\.?\d*)查找一个带有或不带小数位的数字。

([\-+/*])寻找数学符号

所以,他们会同时找到数字和你指定的任何数学符号。

matches[0]包含所有匹配组的组合,matches1,2,3包含第一个值、操作符和第二个值。

这使您可以不使用eval()执行计算。

代码语言:javascript
运行
复制
import re

with open('./izrazi.txt', 'r+') as f:
    lst = f.readlines()
with open('./izrazi2.txt', 'w+') as f:
    for line in lst:
        matches = re.match(r'(\d+\.?\d*)([\-+/*])(\d+\.?\d*)', line)
        if matches:
            if matches[2] == "-":
                calc = float(matches[1]) - float(matches[3])
            if matches[2] == "+":
                calc = float(matches[1]) + float(matches[3])
            if matches[2] == "/":
                calc = float(matches[1]) / float(matches[3])
            if matches[2] == "*":
                calc = float(matches[1]) * float(matches[3])
            f.write(f"{matches[0]}={calc:g}\n")

输入如下:

代码语言:javascript
运行
复制
4-2
9-3
3.142/22
34.2*91.44
9-3
3.142/22
34.2*91.4

这确实提供了以下方面的预期产出:

代码语言:javascript
运行
复制
4-2=2
9-3=6
3.142/22=0.142818
34.2*91.44=3127.25
9-3=6
3.142/22=0.142818
34.2*91.4=3125.88

顺便说一下,您不能将set用于诸如-/这样的操作,因为它们不是可交换的。A set object is an unordered collection of distinct, hashable objects,所以它根本不适合与数学术语一起使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64834617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档