Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.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_Python 3.x_Substring - Fatal编程技术网

在python中反转字符串中的子字符串

在python中反转字符串中的子字符串,python,python-3.x,substring,Python,Python 3.x,Substring,我正在编写一个程序来反转python中括在括号中的子字符串。结果字符串不应包含任何括号。我打印b1、b2和ch用于测试目的。似乎在while循环内for循环的第二次迭代中,b1变量没有使用正确的索引进行更新。 我试着写一个如下的解决方案: def reverseParentheses(s): r = s sstring = '' astring = '' b1 = b2 = 0 count = 0 for ch in s: if c

我正在编写一个程序来反转python中括在括号中的子字符串。结果字符串不应包含任何括号。我打印b1、b2和ch用于测试目的。似乎在while循环内for循环的第二次迭代中,b1变量没有使用正确的索引进行更新。 我试着写一个如下的解决方案:

def reverseParentheses(s):
    r = s
    sstring = ''
    astring = ''
    b1 = b2 = 0
    count = 0
    for ch in s:
        if ch == '(':
            count+=1
        elif ch ==')':
            count+=1
        else:
            pass

    while True:
        b1 = b2 = 0
        for ch in r:
            if ch == '(':
                b1 = r.index(ch)
                print("b1= ",b1, ch)
            if ch == ')':
                b2 = r.index(ch)
                print("b2= ",b2, ch)
                sstring = r[b2-1:b1:-1]
                print(r)
                print(sstring)
                astring = r[0:b1]+sstring+r[b2+1:]
                print(astring)
                r = astring
                break
        if len(astring)+count == len(s):
            break
    return r



s = "a(bcdefghijkl(mno)p)q"
print(reverseParentheses(s))
这是我得到的输出: aonmpbcdefghijklq 这是我期望的输出:
apmnolkjihgfedcbq

处理嵌套分隔符的一个好方法是使用堆栈。遇到开头分隔符时,将新集合推送到堆栈中<代码>弹出()。这将保持嵌套顺序正确

这里有一种方法可以做到这一点(它不检查平衡括号,但不难添加):


一种方法,通过找到括号的位置并从内到外反转(因此包含在偶数个括号之间的括号保持不变),最后去掉括号:

s = "a(bcdefghijkl(mno)p)q"

leftp = reversed([pos for pos, char in enumerate(s) if char == "("])
rightp = [pos for pos, char in enumerate(s) if char == ")"]

for i in zip(leftp,rightp):
    subs = s[i[0]+1:i[1]][::-1]
    s = s[:i[0]+1]+subs+s[i[1]:]
for c in ["(", ")"]:
    s = s.replace(c, "")
print(s) # Outputs "apmnolkjihgfedcbq"
编辑

对于非嵌套的括号,正如所指出的那样。@Mark Meyer,您可以按描述找到它们,并且适用相同的规则

def find_parens(s):
    toret = {}
    pstack = []
    for i, c in enumerate(s):
        if c == '(':
            pstack.append(i)
        elif c == ')':
            if len(pstack) == 0:
                raise IndexError("No matching closing parens at: " + str(i))
            toret[pstack.pop()] = i
    if len(pstack) > 0:
        raise IndexError("No matching opening parens at: " + str(pstack.pop()))
    return toret

s = "a(bcd)efghijkl(mno)pq"
parens = find_parens(s)

for leftp, rightp in parens.items():
    subs = s[leftp+1:rightp][::-1]
    s = s[:leftp+1]+subs+s[rightp:]
for c in ["(", ")"]:
    s = s.replace(c, "")
print(s) # Outputs "adcbefghijklonmpq" 

你期望的输出是什么?它输出这个:b1=1(b1=1(b2=17)a(bcdefghijkl(mno)p)q onm(lkjihgfedcb aonm(lkjihgfedcbp)q b1=4(b2=17)aonm(lkjihgfedcbp)q pbcdefghijkl aonmpbcdefghijklq aonmpbcdefghijklq。最后一行是程序的最终结果。在最深嵌套的paren级别上查找parens索引,在中间反转字符,重复,直到没有parens剩余。不要在注释中回答,您的问题包括预期输出和实际输出是的,这是对问题的正确评估。似乎字符串有问题,例如:
s=“(ab)cdefghijklmno(pq)”
-->“conmlkjihgfedcbadefghijklmnopq”比您现在的更健壮hehe:PSeems现在非常防弹。
def find_parens(s):
    toret = {}
    pstack = []
    for i, c in enumerate(s):
        if c == '(':
            pstack.append(i)
        elif c == ')':
            if len(pstack) == 0:
                raise IndexError("No matching closing parens at: " + str(i))
            toret[pstack.pop()] = i
    if len(pstack) > 0:
        raise IndexError("No matching opening parens at: " + str(pstack.pop()))
    return toret

s = "a(bcd)efghijkl(mno)pq"
parens = find_parens(s)

for leftp, rightp in parens.items():
    subs = s[leftp+1:rightp][::-1]
    s = s[:leftp+1]+subs+s[rightp:]
for c in ["(", ")"]:
    s = s.replace(c, "")
print(s) # Outputs "adcbefghijklonmpq"