首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写函子,通过添加字符以某种方式修改某个字符串。

编写函子,通过添加字符以某种方式修改某个字符串。
EN

Stack Overflow用户
提问于 2020-03-25 23:25:34
回答 5查看 652关注 0票数 7

我必须编写一个接受字符串的函数,并将返回带有添加"asteriks“或"*”符号的字符串来表示乘法。

众所周知,4(3)是另一种表示乘法的方法,4*3或(4)(3)或4*(3)或4*(3)等等。我的代码需要通过在4和3之间添加一个asterik来解决这个问题,因为当乘法用括号显示而没有乘法运算符“*”时。

下面是一些例子:

  • "4(3)“-> "4*(3)”
  • (4)(3)“-> "(4)*(3)”
  • "4*2 +9-4(-3)“-> "4*2 +9-4*(-3)”
  • (-9)(-2) (4)“-> "(-9)*(2) *(4)”
  • 4^(3)“-> "4^(3)”
  • "(4-3)(4+2)“-> "(4-3)*(4+2)”
  • “-> "(Aflkdsjalkb)*(g)”
  • "g(d)(f)“-> "g*(d)*(f)”
  • (4) (3)“-> "(4)*(3)”

我不太清楚如何做到这一点,我正在考虑如何找到左括号,然后简单地在那个位置添加一个"*“,但这是行不通的,因此我的第三个示例的开头将输出”* (-9)“,这是我不想要的,或者我的第四个输出"4^*(3)”的示例。对于如何解决这个问题,有什么想法吗?谢谢。

下面是我尝试过的一些东西,很明显它不起作用:

代码语言:javascript
复制
while index < len(stringtobeconverted)
    parenthesis = stringtobeconverted[index]
    if parenthesis == "(":
        stringtobeconverted[index-1] = "*"
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-03-25 23:57:17

我会分享我的。

代码语言:javascript
复制
def insertAsteriks(string):

    lstring = list(string)
    c = False

    for i in range(1, len(lstring)):

        if c:
            c = False
            pass
        elif lstring[i] == '(' and (lstring[i - 1] == ')' or lstring[i - 1].isdigit() or lstring[i - 1].isalpha() or (lstring[i - 1] == ' ' and not lstring[i - 2] in "*^-+/")):
            lstring.insert(i, '*')
            c = True

    return ''.join(lstring)

让我们检查一下您的输入。

代码语言:javascript
复制
print(insertAsteriks("4(3)"))
print(insertAsteriks("(4)(3)"))
print(insertAsteriks("4*2 + 9 -4(-3)"))
print(insertAsteriks("(-9)(-2) (4)"))
print(insertAsteriks("(4)^(-3)"))
print(insertAsteriks("ABC(DEF)"))
print(insertAsteriks("g(d)(f)"))
print(insertAsteriks("(g)-(d)"))

产出如下:

代码语言:javascript
复制
4*(3)
(4)*(3)
4*2 + 9 -4*(-3)
(-9)*(-2) (4)
(4)^(-3)
ABC*(DEF)
g*(d)*(f)
(g)-(d)

[Finished in 0.0s]
票数 2
EN

Stack Overflow用户

发布于 2020-03-25 23:40:29

代码语言:javascript
复制
In [15]: def add_multiplies(input_string): 
    ...:     return re.sub(r'([^-+*/])\(', r'\1*(', input_string) 
    ...:      
    ...:      
    ...:                                                                                                                                    

In [16]: for example in examples: 
    ...:     print(f"{example} -> {add_multiplies(example)}") 
    ...:                                                                                                                                    
4(3) -> 4*(3)
(4)(3) -> (4)*(3)
4*2 + 9 -4(-3) -> 4*2 + 9 -4*(-3)
(-9)(-2) (4) -> (-9)*(-2) *(4)
4^(3) -> 4^*(3)
(4-3)(4+2) -> (4-3)*(4+2)
(Aflkdsjalkb)(g) -> (Aflkdsjalkb)*(g)
g(d)(f) -> g*(d)*(f)
(g)-(d) -> (g)-(d)
票数 3
EN

Stack Overflow用户

发布于 2020-03-26 09:15:51

tl;dr–而不是将其视为字符串转换,您可以:

  1. 将输入字符串解析为抽象表示形式。
  2. 从抽象表示生成一个新的输出字符串。

解析输入以创建抽象语法树,然后发出新字符串。

一般来说,你应该:

  1. 为数学表达式创建逻辑表示. 您需要构建一个抽象语法树(AST)来表示每个表达式。例如, 2(3(4)+5)

可以形成一棵树,如:

代码语言:javascript
复制
\*  /  \ 2    +     /  \    \*    5   /  \  3    4

,其中该树中的每个节点(2345*+)都是一个具有对其子对象的引用的对象。

  1. 编写用于解析输入.的逻辑。 编写一个可以将"2(3(4)+5)"解析为抽象语法树的逻辑,该树表示它的含义。
  2. 编写一个逻辑来序列化数据. 现在您已经获得了概念形式的数据,您可以编写将其转换为新的所需格式的方法。

注意:字符串转换对于快速脚本编写可能更容易。

正如其他答案所示,如果您只需要一个快速脚本,那么直接字符串转换就会更容易,例如,您有一些文本只想很快地重新格式化。例如,正如@保尔·惠普的回答所演示的那样,正则表达式可以使这样的脚本编写得非常快速和容易。

也就是说,对于专业项目,您通常希望在发出新表示之前将数据解析为抽象表示。字符串转换技巧通常不会随着复杂性的增加而扩展得很好,而且除了简单的情况外,它们在功能上是有限的,而且很容易出错。

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

https://stackoverflow.com/questions/60858862

复制
相关文章

相似问题

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