提问人:ASD 提问时间:11/12/2023 更新时间:11/12/2023 访问量:46
替换字符串中的反转单词,来自列表
Replacing reversed words in string, from list
问:
蟒
我有反转词的列表:
['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 个字符长的字符串
我已经搜索了替换循环,但没有找到任何东西
答:
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_k
a
>>> 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 替换一起使用。format
dict
假设使用普通括号分隔要替换的单词,并且不允许使用大括号(保留用于替换,否则需要转义)。
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)
评论
a = a.replace(...)
print(a)