字符串中反向标记的子字符串

2024-10-01 07:20:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串,其中<>中的每个标记子字符串 必须颠倒(括号不嵌套)。例如

"hello <wolfrevokcats>, how <t uoy era>oday?"

应该变成

^{pr2}$

我目前的想法是在字符串上循环并找到索引对 其中<和{}是。然后简单地把绳子切成薄片 所有的东西都用记号笔颠倒过来了。 这是正确的方法吗?有明显的/更好的解决方案吗?在


Tags: 方法字符串标记hello解决方案how括号薄片
3条回答

我假设这是一个课程作业,不允许使用正则表达式。所以我要提供一个不使用它的解决方案。在

content = "hello <wolfrevokcats>, how <t uoy era>oday?"

insert_pos = -1
result = []
placeholder_count = 0

for pos, ch in enumerate(content):
    if ch == '<':
        insert_pos = pos
    elif ch == '>':
        insert_pos = -1
        placeholder_count += 1
    elif insert_pos >= 0:
        result.insert(insert_pos - (placeholder_count * 2), ch)
    else:
        result.append(ch)

print("".join(result))

这段代码的要点是在字符串中一次只传递一个字符。当在括号外时,只需在结果字符串的末尾附加字符。在括号内时,将字符插入左括号的位置(即预挂字符)。在

或者,使用^{}和一个替换函数

>>> import re 
s = 'hello <wolfrevokcats>, how <t uoy era>oday?'
>>> re.sub(r"<(.*?)>", lambda match: match.group(1)[::-1], s)
'hello stackoverflow, how are you today?'

其中.*?将以non-greedy方式匹配任意数量的任何字符。它周围的括号可以帮助我们将它捕获到group中,然后在替换函数-match.group(1)中引用它。[::-1]切片表示法reverses a string。在

正则表达式非常简单。re.sub将函数作为匹配对象传递给的参数。在

>>> import re
>>> s = 'hello <wolfrevokcats>, how <t uoy era>oday?'
>>> re.sub('<(.*?)>', lambda m: m.group(1)[::-1], s)
'hello stackoverflow, how are you today?'

正则表达式说明:

<(.*?)>将匹配匹配匹配组1中<和{}之间的所有内容。为了确保regex引擎在第一个>符号出现时停止,使用了惰性量词*?。在

传递给re.sub的函数lambda m: m.group(1)[::-1]获取匹配对象,提取组1,并反转字符串。最后re.sub插入这个返回值。在

相关问题 更多 >