Python 字符串方法

community_322 2021-09-10 16:06:20

Python 的字符串处理, 一个朴实无华的四则运算计算器,批量计算小学生四则运算表达式

# -*- coding: UTF-8 -*-
import re

def naive_calc(code):
    # TODO(You): 请在此实现简易四则运算

def test():
    code = '''
    1+2
    3+4
    5-3
    4*3
    10/2
    '''
    naive_calc(code)

if __name__ == '__main__':
    test()

请选出下列能正确实现这一功能的选项。

返回练习题答题页面

...全文
1220 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
109702008 2024-04-30
  • 打赏
  • 举报
回复 2

在正则表达式中,\s 是一个特殊的字符类,代表任何空白字符,包括空格、制表符(Tab)、换行符、回车符和其他 Unicode 空白字符。字符类 * 表示前面的字符类(在这里是 \s)可以出现零次或多次。
所以,在正则表达式 \s*(\d+)([+-*/])(\d+)\s* 中:

  • \s* 匹配任意数量的空白字符,包括零个。
  • (\d+) 匹配一个或多个数字字符(0-9),并将其捕获为一个分组。
  • ([+-*/]) 匹配加号、减号、乘号或除号中的一个,并将其捕获为一个分组。
  • 再次,(\d+) 匹配一个或多个数字字符,并将其捕获为另一个分组。
  • 最后的 \s* 再次匹配任意数量的空白字符,包括零个。
    因此,这个正则表达式可以匹配形如 1 + 2 的四则运算表达式,空白字符用于处理可能出现在表达式周围的空格。例如,它可以匹配 1+2 或 3 * 4,其中的空格数量并不影响匹配。
    请注意,\s 和 * 用于模式的不同部分,\s 是一个字符类,而 * 是一个表示数量的元字符。 结合在一起 \s* 表示匹配任意数量的空白字符。
109702008 2024-04-29
  • 打赏
  • 举报
回复

这个正则表达式用来匹配简单的四则运算表达式。下面分别解释各个部分的含义:

  • \s*: 匹配任意数量的空白字符(空格、制表符等)。
  • (\d+): 匹配一个或多个数字,并将这个数字序列作为一个捕获组。\d 是匹配任意数字的元字符,而后面的 + 表示匹配一个或多个前面的元素。括号 () 表示捕获组,用于后续引用这个匹配到的内容。
  • ([+-*/]): 匹配四个运算符中的任意一个,并将匹配到的运算符作为一个捕获组。由于加号 +、减号 -、星号 * 和斜杠 / 在正则表达式中有特殊的含义,当我们希望匹配这些字符本身时,需要在它们前面使用反斜杠来转义。
  • (\d+): 与前面的 (\d+) 类似,再次匹配一个或多个数字,作为另一个捕获组,代表运算符后面的操作数。
  • \s*: 和表达式开始的 \s* 相似,匹配尾部的任意数量的空白字符。
    整个正则表达式匹配的是这样一个模式:可有可无的空格,后跟一串数字(左操作数),再跟一个加减乘除运算符,然后是另一串数字(右操作数),最后是可有可无的空格。
    当 re.match 对某行字符串使用此正则表达式时,如果该行字符串符合这个四则运算的模式,它将会得到一个匹配对象。通过该匹配对象,可以使用 group(1) 获取左操作数、group(2) 获取运算符和 group(3) 获取右操作数。这些捕获组可以用于后续的四则运算逻辑。
109702008 2024-04-29
  • 打赏
  • 举报
回复 1

正确实现一个简易四则运算计算器的代码是选项 D。下面是对每一个选项的分析:
A: 这个选项没有把从正则表达式获取的字符串转换成整数进行计算,导致它只会将字符串拼接在一起而不是执行数学运算。同时,这个选项还使用了错误的方法来判断除数是否为零。
B: 这一选项的正则表达式使用了错误的顺序,在 re.match 函数中第一个参数应该是模式串,第二个参数是要匹配的字符串。这个错误会导致 re.match 不能正确执行。
C: 此选项中提取代码行的逻辑是错误的,因为 if l.strip() == '' 将会排除所有非空行。正确的逻辑应该是对空行执行 strip() 后不等于空字符串的检查。此外,这段代码也没有对正则表达式匹配失败的情况做错误处理。
D: 这是正确的实现。它首先分割字符串获取非空行,然后利用正则表达式对每行代码进行匹配,提取左操作数、运算符和右操作数。接着,它将字符串转换为整数,并根据运算符执行相应的四则运算。最后,它正确地检查除数是否为零以避免除以零的情况。
因此,正确的实现是:

def naive_calc(code):
    code_lines = [l for l in code.split('\n') if l.strip() != '']
    for line in code_lines:
        ret = re.match("\s*(\d+)([\+\-\*\/])(\d+)\s*", line)
        if not ret:  # 如果匹配失败,则跳过这行
            continue
        left = ret.group(1)
        op = ret.group(2)
        right = ret.group(3)

        if op == '+':
            print('{}+{}={}'.format(left, right, int(left)+int(right)))
        elif op == '-':
            print('{}-{}={}'.format(left, right, int(left)-int(right)))
        elif op == '*':
            print('{}*{}={}'.format(left, right, int(left)*int(right)))
        elif op == '/':
            right_int = int(right)
            if right_int != 0:
                print('{}/{}={}'.format(left, right, int(left)/right_int))
            else:
                print('Error: Division by zero')  # 正确处理除以零的错误
master_the_world 2023-12-16
  • 打赏
  • 举报
回复

看的眼睛疼

CSDN-Ada助手 2023-12-26
  • 举报
回复
@master_the_world 可能需要休息一下或者调整一下阅读的姿势,保护好眼睛哦。
AI算法实习生 2023-11-19
  • 打赏
  • 举报
回复
感觉有些题目出的,就是强行用的感觉!
CSDN-Ada助手 2023-12-26
  • 举报
回复 1
@AI算法实习生 是的,有时候题目的设置可能会让人感觉有些困难。但是通过练习和思考,我们可以更好地掌握知识。加油!如果有任何问题,都可以向我提问。
算力鬼才信 2023-06-19
  • 打赏
  • 举报
回复
这个正则也有毛病,明明用,三元表达式处理了,放入列表的字符串,你还用正则去匹配前后1-n个空字符,越看越气
CSDN-Ada助手 2023-06-19
  • 举报
回复
@算力鬼才信 很抱歉让您感到不满意。我们已经核实了代码,并发现之前的实现确实存在问题。我们已经更新了代码,感谢您的指出。
算力鬼才信 2023-06-19
  • 打赏
  • 举报
回复
从正则拿到的数据类型,应该是字符串,字符串不能进行运算符操作,你如果用以换行符分割的方法,拿出数据,但是不能保证数据前后没有空格啊,你在这里,用如果这个字符的前后不存在字符,就把它放进去,如果存在字符,一个都放不进不去,你处理啥啊,这题我真的想打人
CSDN-Ada助手 2023-06-19
  • 举报
回复 1
@算力鬼才信 很抱歉听到您的困惑。针对您所提到的问题,我们可以使用strip()方法去除字符串前后的空格,以确保数据的准确性。同时,我们也可以在正则表达式中加入\s*来匹配可能存在的空格。希望这些方法能够帮助您顺利解决问题。如果还有其他问题,请随时向我提问。
清风吹雨泡泡 2023-03-02
  • 打赏
  • 举报
回复 15
# 代码通过正则表达式匹配输入的每一行中的第一个数字、运算符、第二个数字,
# 并根据不同的运算符进行相应的计算并输出结果。其中,如果出现了除数为0的
# 情况,则不会输出结果。

# 代码中的 test() 函数会调用 naive_calc() 函数,传入一段字符串作为
# 待处理的代码,即 code 变量中的多行字符串。函数首先将这段代码按照换行
# 符分割成多行,然后对每一行进行处理。通过正则表达式提取出每一行中的运算
# 式,并对运算符进行判断,进行不同的计算并输出结果。最终输出的结果会显示
# 在控制台中。
# -*- coding: UTF-8 -*-
import re


def naive_calc(code):
    code_lines = [l for l in code.split('\n') if l.strip() != '']
    # 这句代码是用来将多行字符串 code 按照换行符分割成多个行字符串,并将这
    # 些行字符串保存在一个列表中。
    # 具体来说,代码首先调用字符串对象的 split() 方法,将字符串按照换行符
    # 分割成多个子字符串,然后将这些子字符串保存在一个列表中。由于在处理多
    # 行字符串时,可能会出现包含多个连续空格或制表符的情况,因此代码中使用
    # strip() 方法来去掉每个行字符串首尾的空格和制表符,并使用 if 条件语
    # 句来过滤掉空行,即长度为0的行字符串。最终得到的列表 code_lines 中,
    # 每个元素就是一行非空的字符串。这个"列表" code_lines 将会作为后面的处
    # 理输入代码的数据源。
    # print(code_lines) 输出结果如下
    # ['    1+2', '    3+4', '    5-3', '    4*3', '    10/2']

    for line in code_lines:
        print(line)
        ret = re.match("\s*(\d+)([\+\-\*\/])(\d+)\s*", line)
        # 这个正则表达式可以用来匹配简单的数学表达式,如 2+3、 5 /6等等。
        # 这个正则表达式包含了三个捕获组:
        # 第一个捕获组 \s*(\d+) 匹配任意数量的空格,然后捕获一个或多个数字。
        # 这个捕获组用于匹配表达式中的第一个数字。
        # 第二个捕获组 ([\+\-\*\/]) 匹配加号、减号、乘号或除号。这个捕获组
        # 用于匹配表达式中的运算符。
        # 第三个捕获组 (\d+) 匹配一个或多个数字,并捕获它们。这个捕获组用于
        # 匹配表达式中的第二个数字。
        # 整个表达式用括号括起来,表示需要捕获整个匹配结果,以便后续的处理。
        # 在每个数字和运算符周围的空格使用了 \s* 来匹配任意数量的空格,以防止
        # 输入表达式时出现意外的空格。
        # 注意,这个正则表达式只能匹配简单的数学表达式,而不能处理复杂的表达式
        # ,例如带有括号、指数、函数等等。如果需要处理更复杂的表达式,可能需要
        # 使用更复杂的正则表达式或其他解析器。
        # print(ret.group()) 打印结果为:    1+2(注意前面是有空格的)

        left = ret.group(1)
        op = ret.group(2)
        right = ret.group(3)
        # 这几行代码将正则表达式匹配得到的结果分别赋值给了left、op和right三个
        # 变量,把空格去掉了,具体来说:
        # ret.group(1)代表正则表达式中第1个括号捕获到的内容,即匹配到的第1个数字;
        # ret.group(2)代表正则表达式中第2个括号捕获到的内容,即匹配到的操作符;
        # ret.group(3)代表正则表达式中第3个括号捕获到的内容,即匹配到的第2个数字。
        # 这些变量会在接下来的代码中被使用,计算出对应表达式的结果。
        # print(left, op, right) 打印结果为:1+2(空格没有啦!)

        if op == '+':
            print('{}+{}={}'.format(left, right, int(left) + int(right)))
        # 因为op变量中存储了四则运算符,所以根据四则运算符加减乘除 +-*/ 来判断我们该
        # 做哪项运算。由于我们取出的是字符串,所以我们在计算时候需要将字符串转为数字才
        # 行。即:
        # int(left) + int(right)

        elif op == '-':
            print('{}-{}={}'.format(left, right, int(left) - int(right)))
        elif op == '*':
            print('{}*{}={}'.format(left, right, int(left) * int(right)))
        elif op == '/' and right != '0':
            print('{}/{}={}'.format(left, right, int(left) / int(right)))

def test():
    code = '''
    1+2
    3+4
    5-3
    4*3
    10/2
    '''
    naive_calc(code)


test()
coder_ininin 2023-03-07
  • 举报
回复
@清风吹雨泡泡
笨笨鲨 2023-04-23
  • 举报
回复
@清风吹雨泡泡
CSDN-Ada助手 2023-04-28
  • 举报
回复 1
@清风吹雨泡泡 这段代码是一个简易的四则运算计算器,它可以通过正则表达式匹配输入的每一行中的第一个数字、运算符、第二个数字,并根据不同的运算符进行相应的计算并输出结果。它可以处理简单的数学表达式,如 2+3、 5 /6等等。但是需要注意的是,这个正则表达式只能匹配简单的数学表达式,而不能处理复杂的表达式,例如带有括号、指数、函数等等。如果需要处理更复杂的表达式,可能需要使用更复杂的正则表达式或其他解析器。
匿名用户2022 2023-01-19
  • 打赏
  • 举报
回复
近视,找不同找半天😅
CSDN-Ada助手 2023-04-28
  • 举报
回复
@匿名用户2022 哈哈哈,有时候找不同的游戏确实挺难的。不过这道题目可不是找不同哦,是关于Python字符串处理的习题。加油!
Am_yz 2022-11-22
  • 打赏
  • 举报
回复
这都什么题啊,这是锻炼我们的找不同能力吗,出题人就这点水平
CSDN-Ada助手 2022-11-22
  • 举报
回复
@Am_yz 可以静下来认真思考下, 应该不难理解
「已注销」 2022-11-20
  • 打赏
  • 举报
回复

没仔细看还以为那个‘’是双引号

m0_71334485 2022-11-19
  • 打赏
  • 举报
回复
数据类型
Kiritori 2022-09-22
  • 打赏
  • 举报
回复

啊,我还以为是match的用法问题,不是要先写那个正则表达式再写字符串吗?

阳光果粒儿程 2022-08-29
  • 打赏
  • 举报
回复

正确答案贴到python中都没有输出结果

小欣欣579 2022-07-28
  • 打赏
  • 举报
回复
def naive_calc(code):
    code_lines = [l for l in code.split() if l.strip() == '']
    for line in code_lines:
        ret = re.match("\s*(\d+)([+-*/])(\d+)\s*", line)
        left = ret.group(1)
        op = ret.group(2)
        right = ret.group(3)
        if op == '+':
            print('{}+{}={}'.format(left, right, int(left)+int(right)))
        elif op == '-':
            print('{}-{}={}'.format(left, right, int(left)-int(right)))
        elif op == '*':
            print('{}*{}={}'.format(left, right, int(left)*int(right)))
        elif op == '/' and right != '0':
            print('{}/{}={}'.format(left, right, int(left)/int(right)))

开头的for部分是遍历code_lines列表中的所有元素,每次遍历的结果存入line变量中。其中,code_lines是一个列表,它包含了code字符串中所有的非空行。

搞怪的猫粮 2022-09-02
  • 举报
回复 1
@小欣欣579 这题错在code_lines = [l for l in code.split() if l.strip() == ''],if l.strip == ‘’取到的都是空字符串,for下面的代码也是数据处理正则表达式,解释起来比较麻烦,match 函数有两个参数并且必须从字符串开头开始匹配"\s*(\d+)([+-*/])(\d+)\s*" 这部分是正则表达式可以分为5个部分去看\s*表示前面的空格,(\d+)匹配到的数字,([+-*/])指定匹配+,-,*,/4个字符,(\d+)匹配到的数字。你把line打印出来就明白了。
沛哥儿 2022-06-27
  • 打赏
  • 举报
回复
能不能简单点,字符串就字符串。搞这么长,读题都麻烦
暴走的牛奶Lee 2022-06-21
  • 打赏
  • 举报
回复 2
def naive_calc(code):
    code_lines = [l.strip(' ') for l in code.split('\n') if l.strip() != '']
    print(code_lines)
    for line in code_lines:
        if '+' in line:
            a, b = line.split('+')
            print(f'{line}={int(a) + int(b)}')
        elif '-' in line:
            a, b = line.strip(' ').split('-')
            print(f'{line}={int(a) - int(b)}')
        elif '*' in line:
            a, b = line.split('*')
            print(f'{line}={int(a) * int(b)}')
        else:
            a, b = line.split('/')
            print(f'{line}={int(a) / int(b)}')
NNNOC 2022-06-19
  • 打赏
  • 举报
回复 3

字符串要转化为整数型才能进行四则运算

jared-chenzy 2022-06-14
  • 打赏
  • 举报
回复 2

四则运算需要将字符串转换为int才可以进行

  • 打赏
  • 举报
回复 3

这题出的,表面上是考四则运算,实则是考数据类型

加载更多回复(4)

27

社区成员

发帖
与我相关
我的任务
社区管理员
  • community_322
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧