Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字符串中的运算符插入表达式字符串_Python_String - Fatal编程技术网

Python 将字符串中的运算符插入表达式字符串

Python 将字符串中的运算符插入表达式字符串,python,string,Python,String,给定一个带变量和括号的字符串: 'a((bc)((de)f))' 和一系列运算符: '+-+-+' import re rules = re.compile(r'[a-z]{2}|[a-z]\(|\)\(|\)[a-z]') class Replace: def __init__(self, operators): self.it_operators = iter(operators) def __call__(self, match):

给定一个带变量和括号的字符串:

'a((bc)((de)f))'
和一系列运算符:

'+-+-+'
import re

rules = re.compile(r'[a-z]{2}|[a-z]\(|\)\(|\)[a-z]')

class Replace:
    def __init__(self, operators):
        self.it_operators = iter(operators)
        
    def __call__(self, match):
        return next(self.it_operators).join(match.group())

variables = 'a((bc)((de)f))'
operators = '+-+-+'

print(rules.sub(Replace(operators), variables))
# a+((b-c)+((d-e)+f))
我希望将每个运算符(按顺序)插入以下模式之间的第一个字符串中(其中,char定义为非开括号或闭括号的字符):

  • char后跟char
  • 字符后跟“(”
  • “)”后接“(”
  • “)”后跟字符
要给出结果:

'a+((b-c)+((d-e)+f))'
编辑:我让它与下面的代码一起工作,但有没有更优雅的方法来做到这一点,即没有for循环

    x = 'a((bc)((de)f))'
    operators = '+-+-+'
    y = x
    z = 0
    for i in range(len(x)):
        if i < len(x)-1:
            xx = x[i]
            isChar = True if x[i] != '(' and x[i] != ')' else False
            isPO = True if x[i] == '(' else False
            isPC = True if x[i] == ')' else False

            isNxtChar = True if x[i+1] != '(' and x[i+1] != ')' else False
            isNxtPO = True if x[i+1] == '(' else False
            isNxtPC = True if x[i+1] == ')' else False

            if (isChar and (isNxtChar or isNxtPO)) or (isPC and (isNxtPO or isNxtChar)):
                aa = operators[z]
                split1 = x[:i+1]
                split2 = x[i+1:]
                y = y[:i+z+1] + operators[z] + x[i+1:]
                if z+1 < len(operators):
                    z+=1
            
    print (y)
x='a((bc)((de)f))'
运算符='+-+-+'
y=x
z=0
对于范围内的i(len(x)):
如果i
initialExpr='a((bc)((de)f))'
运算符='+-+-+'
countOp=0
countChar=0
对于initialExpr中的字符:
countChar+=1
打印(字符,结束=“”)
如果countChar
这应该可以完成任务。 假设变量、括号和运算符的顺序和编号正确。

initialExpr='a((bc)((de)f))'
运算符='+-+-+'
countOp=0
countChar=0
对于initialExpr中的字符:
countChar+=1
打印(字符,结束=“”)
如果countChar
这应该可以完成任务。
假设变量、括号和运算符的顺序和编号正确。

一行使用
re

import re

s = "a((bc)((de)f))"
o = "+-+-+"

print(
    re.sub(
        r"(?:[a-z](?:\(|[a-z]))|(?:\)(?:\(|[a-z]))",
        lambda g, i=iter(o): next(i).join(g.group()),
        s,
    )
)
印刷品:

a+((b-c)+((d-e)+f))

使用
re
的一个衬里:

import re

s = "a((bc)((de)f))"
o = "+-+-+"

print(
    re.sub(
        r"(?:[a-z](?:\(|[a-z]))|(?:\)(?:\(|[a-z]))",
        lambda g, i=iter(o): next(i).join(g.group()),
        s,
    )
)
印刷品:

a+((b-c)+((d-e)+f))

可以使用与要在其中插入运算符的字符对匹配的正则表达式

然后,您可以将
re.sub
与替换函数一起使用,该替换函数将两个字符与下一个运算符连接起来

我们可以使用带有
\uuuuu call\uuuu
方法的类,该类在运算符上使用迭代器:

'+-+-+'
import re

rules = re.compile(r'[a-z]{2}|[a-z]\(|\)\(|\)[a-z]')

class Replace:
    def __init__(self, operators):
        self.it_operators = iter(operators)
        
    def __call__(self, match):
        return next(self.it_operators).join(match.group())

variables = 'a((bc)((de)f))'
operators = '+-+-+'

print(rules.sub(Replace(operators), variables))
# a+((b-c)+((d-e)+f))
Replace(operators)
返回一个可调用的
Replace
实例,其
it\u operators
属性是一个迭代器,可以在运算符上进行迭代。
对于每个匹配的字符对,
sub
调用此实例,其
\uuuu call\uuu
方法返回两个字符的替换项,该替换项通过将它们与下一个运算符联接而生成。

您可以使用一个正则表达式来匹配要在其中插入运算符的字符对

然后,您可以将
re.sub
与替换函数一起使用,该替换函数将两个字符与下一个运算符连接起来

我们可以使用带有
\uuuuu call\uuuu
方法的类,该类在运算符上使用迭代器:

'+-+-+'
import re

rules = re.compile(r'[a-z]{2}|[a-z]\(|\)\(|\)[a-z]')

class Replace:
    def __init__(self, operators):
        self.it_operators = iter(operators)
        
    def __call__(self, match):
        return next(self.it_operators).join(match.group())

variables = 'a((bc)((de)f))'
operators = '+-+-+'

print(rules.sub(Replace(operators), variables))
# a+((b-c)+((d-e)+f))
Replace(operators)
返回一个可调用的
Replace
实例,其
it\u operators
属性是一个迭代器,可以在运算符上进行迭代。
对于每一对匹配的字符,
sub
调用这个实例,其
\uuuuu call\uuuu
方法返回这两个字符的替换,它通过将它们与下一个操作符连接来构建。

您尝试了什么,它到底有什么问题?@jornsharpe我用功能代码编辑了我的文章,但是如果您有ny建议如何做得更好任何事情都是appreciated@JohnColeman对不起,我不是那个意思。我只是想用最少的代码“更好”来寻找最有效的方法如何,准确地说?优雅不是一个客观的衡量标准。如果你有你认为可以改进的工作代码,请参阅。我的代码在我发表文章时不起作用。我是在问了之后才开始工作的。你或任何人对如何在不使用for循环的情况下实现结果有什么建议吗?我不知道代码审查,谢谢你指出这一点。我也可以在那里发帖。你做了什么尝试,它到底有什么问题?@jornsharpe我用功能代码编辑了我的帖子,但是如果你有任何建议如何让它更好,任何事情都可以appreciated@JohnColeman对不起,我不是那个意思。我只是想用最少的代码找到最有效的方法“更好"如何,准确地说?优雅不是一个客观的衡量标准。如果你有你认为可以改进的工作代码,请参阅。我的代码在我发表文章时不起作用。我是在问了之后才开始工作的。你或任何人对如何在不使用for循环的情况下实现结果有什么建议吗?我不知道代码审查,谢谢你指出这一点。我也可以在那里发布。谢谢!这比我想到的要好。我唯一修改的是,我添加了一个字符串,以便使用它,而不是打印语句elsewhere@CraigNathan,刚刚编辑了我的初始答案,现在的if条件更短。谢谢!这比我想的要好。我唯一能做的就是odified是代替print语句的,我附加了一个字符串以便使用它elsewhere@CraigNathan,刚刚编辑了我的初始答案,现在if条件更短了。@andrejkesly哇谢谢!@andrejkesly哇谢谢!