python - 如何改变获得正确答案的周期?

标签 python string python-3.x cycle

我的任务是创建一个函数,从最里面的对开始,反转常规括号序列中的任何字符串字符。字符串序列可以包含空格、标点符号、字母和括号。所以结果应该是刺痛。

例子

对于字符串

s = "a(bc)de"

输出应该是

reverseParentheses(s) = "acbde".

我写了下面的代码来解决这个问题:

s_i = s   
for i in range(s.count('(')):
    # reverse letters inside parenthesis
    s_i = s_i.replace(s_i[s_i.rindex('(')+1:s_i.index(')')], s_i[s_i.rindex('(')+1:s_i.index(')')][::-1])
    # delete outward parenthesis
    s_i =s_i[:s_i.rindex('(')] + s_i[s_i.rindex('(')+1:]
    # delete inward parenthesis
    s_i =s_i[:s_i.index(')')] + s_i[s_i.index(')')+1:]
    i += 1
print(s_i)

但是,对于以下字符串,我变成了错误的结果:

s = "abc(cba)ab(bac)c"

应该是

abcabcabcabc

我明白了

abccabbaabcc

s = "The ((quick (brown) (fox) jumps over the lazy) dog)"

应该是这样的:

The god quick nworb xof jumps over the lazy

但我只得到:

The god quick xof nworb jumps over the lazy

我应该如何更正或调整我的代码以使最后两个示例的结果正确?

代码调整

我试图考虑答案和提示,但我无法使用递归。我解决了 parantacies 的问题,当它们只有两个位于:"..(...) (...).., .."

所以我写了下面的代码:

def reverse(s):
#ensure parens are in pairs
if '(' not in s and ')' not in s:
    while '(' in s:
            s = s.replace(s[s.rindex('(')+1:s.index(')')], s[s.rindex('(')+1:s.index(')')][::-1])
            s = s[:s.rindex('(')] + s[s.rindex('(')+1:]
            s = s[:s.index(')')] + s[s.index(')')+1:]
    return s
else:
    if (s[s.index(')'):s.rindex('(')+1] == ''):
        while '(' in s:
                s = s.replace(s[s.rindex('(')+1:s.index(')')], s[s.rindex('(')+1:s.index(')')][::-1])
                s = s[:s.rindex('(')] + s[s.rindex('(')+1:]
                s = s[:s.index(')')] + s[s.index(')')+1:]
        return s
    elif (s[s.index(')'):s.rindex('(')+1] != ''):
        betw = s[s.index(')')+1:s.rindex('(')]
        part1 = s[:s.index(')')+1]
        part2 = s[s.rindex('('):]
        part1 = part1.replace(part1[part1.rindex('(')+1:part1.index(')')], part1[part1.rindex('(')+1:part1.index(')')][::-1])
        part1 = part1[:part1.rindex(')')]
        part2 = part2.replace(part2[part2.rindex('(')+1:part2.index(')')], part2[part2.rindex('(')+1:part2.index(')')][::-1])
        part2 = part2[part2.rindex('(')+1:]
        s = part1+betw+part2
        s = s[:s.rindex('(')] + s[s.rindex('(')+1:]
        s = s[:s.index(')')] + s[s.index(')')+1:]
        while '(' in s:
            s = s.replace(s[s.rindex('(')+1:s.index(')')], s[s.rindex('(')+1:s.index(')')][::-1])
            s = s[:s.rindex('(')] + s[s.rindex('(')+1:]
            s = s[:s.index(')')] + s[s.index(')')+1:]
        return s
    else:
        while '(' in s:
            s = s.replace(s[s.rindex('(')+1:s.index(')')], s[s.rindex('(')+1:s.index(')')][::-1])
            s = s[:s.rindex('(')] + s[s.rindex('(')+1:]
            s = s[:s.index(')')] + s[s.index(')')+1:]
        return s

但是,我认为它不能很好地执行以下示例:

s = "abc(147)ab(123)c(12)asd"

答案应该是:"abc741ab321c21asd" 但我得到 "abc12c321ba147asd"

为了得到正确的答案应该改变什么?

最佳答案

与其手动执行此操作,不如使用 regular expression模块 re专门从事字符串操作

import re

def reverseParentheses(s):
    def reverse_interior(m):
        s = m.group()
        return s[-2:0:-1]
    old = ""
    while old != s:
        old = s
        s = re.sub(r'(\([^\(\)]*\))',reverse_interior,s)
    return s

assert reverseParentheses("a(bc)de") == "acbde"
assert reverseParentheses("abc(cba)ab(bac)c") == "abcabcabcabc"
assert reverseParentheses("The ((quick (brown) (fox) jumps over the lazy) dog)") == "The god quick nworb xof jumps over the lazy"
assert reverseParentheses("((ob))") == "ob"

这里的表达式 '(\([^\(\)]*\))' 将搜索 () 之间的任何内容[^\(\)]* 中定义的字符之一,这反过来意味着不是 ()< 的任何数字字符,这样它会搜索匹配的最里面的组,然后我使用函数re.sub用那个辅助函数替换字符串中的那些,它采用 "(xyz)" 形式的字符串并返回 "zyx"。由于这仅适用于最内层的组,因此在需要进行更改时应重复该过程,因此循环。

关于python - 如何改变获得正确答案的周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44008427/

相关文章:

python - 生成始终包含特定字母python的字符串

android - 格式化和样式化 xml 资源 + 分配给 textview

python - Statsmodels 中的 ARMA 订单规范

python - 根据列表值选择 Pandas 行

c++ - strncpy() 获取字符串结尾

c - 返回的字符串与 c 函数中的字符串不同

python-3.x - 我如何知道今天是否是由于更改民用本地时间而导致的一天,例如标准 python 和 pandas 时间戳中的夏令时?

python - 如何替换字符串中的多个字符?

python - 如何获取 FFMPEG Progress 以创建进度条?

python - 将 PySpark Dataframe 过滤器的结果收集到变量中