替换字符串中的反转单词,来自列表

Replacing reversed words in string, from list

提问人:ASD 提问时间:11/12/2023 更新时间:11/12/2023 访问量:46

问:

我有反转词的列表:

['rab', 'milb']

我有一个字符串,上面写着这些话:

foo(bar)baz(blim)

我怎样才能在恢复时替换这个词?

这就是我所做的:

a = "foo(bar)baz(blim)"
reversed_w = ['rab', 'milb']
for i in range(len(reversed_w)):
    pure_k = a.replace(reversed_w[i][::-1], reversed_w[i])

print(pure_k)

# what i expect: foo(rab)baz(milb)
# what i get: foo(bar)baz(milb)
# it happens cuz after first iteration it "foo(rab)baz(blim)", but
# because i dont know how to "remmember" that state of that string,
# after second iteration i get "foo(bar)baz(milb)", 
# cuz i am making that operation with unedited 
# string: "foo(bar)baz(blim)".

当然,我可以用切片来做,但它的蛮力。想象一下,如果我有 50 个颠倒的单词和 1000 个字符长的字符串

我已经搜索了替换循环,但没有找到任何东西

python 字符串 替换 字符 切片

评论

2赞 gog 11/12/2023
你有没有试过刚才然后?a = a.replace(...)print(a)
1赞 ASD 11/12/2023
布鲁,忘了。这就是我需要的

答:

1赞 Kraigolas 11/12/2023 #1

我只会使用正则表达式:

import re
pattern = re.compile("(.*?)\((.*?)\)")
all_matches = pattern.findall("foo(bar)baz(blim)")
# [('foo', 'bar'), ('baz', 'blim')]

在这里,我们正在做的是创建一个捕获组来捕获如下所示的任何内容:

func_name(argument)

当然,这是匹配的。然后我们以 2 个元组的列表形式获得匹配项,其中第一个元素是函数名称,第二个元素是参数。foo(bar)baz(blim)

然后你可以做你的反转:

result = ""
for func_name, arg in all_matches:
    result += func_name + "(" + "".join(reversed(arg)) + ")"
print(result)
# 'foo(rab)baz(milb)'
1赞 Sash Sinha 11/12/2023 #2

出现问题的原因是您在循环的每次迭代中都进行了重置。相反,您应该更新字符串本身或使用另一个变量来跟踪迭代之间的更改:pure_ka

>>> a = "foo(bar)baz(blim)"
>>> reversed_w = ['rab', 'milb']
>>> for word in reversed_w:
...     a = a.replace(word[::-1], word)
... 
>>> print(a)
foo(rab)baz(milb)
1赞 cards 11/12/2023 #3

与 -mapping 替换一起使用。formatdict

假设使用普通括号分隔要替换的单词,并且不允许使用大括号(保留用于替换,否则需要转义)。

a = "foo(bar)baz(blim)"
rwords = ['rab', 'milb']

word_mapping = {w[::-1]: f"({w})" for w in rwords}
new_a = a.replace('(', '{').replace(')', '}').format(**word_mapping)

或使用 staticmethod 进行单次替换str.maketrans

mapping_for_substitution = str.maketrans(dict(zip("()", "{}")))
new_a = a.translate(mapping_for_substitution).format(**word_mapping)