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