【问题标题】:Replace all values inside nested parantheses替换嵌套括号内的所有值
【发布时间】:2023-03-13 23:05:01
【问题描述】:

我很难理解一个看似简单的问题。我想要做的是稍微改变一个字符串,通过将所有值包装在一个分隔符中,比如括号(),用一个像引号这样的字符,然后标题外壳所有的单词。但我无法让它按预期完全工作。

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

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)

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

【问题讨论】:

  • 所以基本上你想用("替换每个(,用")替换每个)
  • @mkrieger1 我没有这么想,但是当你这么说的时候听起来很简单。实际用例有点不同 - 让我更新一下问题。
  • 我刚刚更新了帖子。我应该更好地表达它,但我还想转换组内的值(例如通过大写每个单词)。
  • @rv.kvtech 是 my answer 为您工作吗?
  • 我不确定您正在应用哪种转换。如果您确实需要获取每个匹配括号内的全部内容,您可以首先读取字符串并计算/索引左括号和右括号,然后提取内容并应用您的转换。您可以从外到内递归地执行此操作。

标签: python str-replace


【解决方案1】:

你可以使用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")")")'

【讨论】:

    【解决方案2】:

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

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

    注意如何使用\"来取消转义“。

    【讨论】:

    • 你不需要转义"。您可以简单地使用单引号:txt.replace('(', '("').replace(')', '")')
    【解决方案3】:

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

    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")")")
    

    【讨论】:

      猜你喜欢
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      相关资源
      最近更新 更多