替换嵌套括号内的所有值

Replace all values inside nested parantheses

我正在努力理解一个看似简单的问题。我想要做的是稍微更改一个字符串,方法是将所有值包装在分隔符(例如括号 () 中)和引号之类的字符中,然后将所有单词用标题框起来。但是我无法让它按预期完全工作。

例如,给定一个简单的字符串:

hello(world)

我想通过稍微修改来替换括号内的部分 - 在本例中是用引号引起来:

hello("World")

我能做到这一点,但问题是当我有嵌套的括号时它不起作用:

hi (hello(world(a test)))

我想结束:

hi ("Hello("World("A Test")")")

但不幸的是,我没有得到预期的结果。

这是我用来测试的代码。顺便说一句,我从这篇文章 here.

中得到了获取字符串中字符索引的想法
import re

def wrap_values_within_group(s: str, delimiter_group='()'):
    start_char, end_char = delimiter_group
    start_indices = [i.start() for i in re.finditer(re.escape(start_char), s)]
    end_indices = [i.start() for i in re.finditer(re.escape(end_char), s)]

    parts = []
    for i in range(len(start_indices)):
        start_pos = start_indices[i]
        end_pos = end_indices[-i]
        repl_pos = start_pos + 1

        parts.append(s[:repl_pos])
        parts.append('"' + s[repl_pos:end_pos].title() + '"')
        parts.append(s[end_pos:])

    return ''.join(parts)

我知道我可以在没有正则表达式的情况下实现这一点,但我想看看如果可能的话不使用正则表达式替换是否可行。我也更喜欢在一个函数中理想地执行此操作,因为我认为重复调用一个函数来进行替换可能会有点慢。欢迎提出任何建议。

您可以使用 lookarounds 拆分并加入:

import re
s = 'hi (hello(world(a test)))'
'"'.join(re.split('(?<=\()|(?=\))', s))

输出:'hi ("hello("world("a test")")")'

大写示例:

s = 'hi (hello(world(a test)))'
l = re.split('(?<=\()|(?=\))', s)
'"'.join([s.capitalize() if i not in (0, len(l)-1) else s
 for i,s in enumerate(l)])

输出:'hi ("Hello("World("A test")")")'

基本上你只需要将每个(替换为(",右边分别是:

txt = "hi (hello(world(a test)))"
txt = txt.replace("(", "(\"").replace(")", "\")")

请注意如何使用 \" 取消转义 ".

我最终在一点递归和辅助转换函数的帮助下解决了这个问题。我花了一段时间才明白我想做什么。再次感谢所有回答或帮助我指明正确方向的人。

def transform_func(s: str):
    return '"' + s.title() + '"'


def wrap_values_within_group(s: str, delimiter_group='()'):
    start_char, end_char = delimiter_group

    if start_char not in s:
        return s

    start_pos = s.index(start_char)
    end_pos = s.rindex(end_char)

    repl_pos = start_pos + 1
    replaced_val = transform_func(wrap_values_within_group(s[repl_pos:end_pos]))

    return f'{s[:repl_pos]}{replaced_val}{s[end_pos:]}'

用法:

print(wrap_values_within_group('hello(world)'))
# hello("World")
print(wrap_values_within_group('hi (hello(world(a test)))'))
# hi ("Hello("World("A Test")")")