[英]Replacing characters of a string by a given string
鉴于此字符串'www__ww_www_'
我需要用以下字符串'1234'
'_'
字符替换所有'_'
字符。 结果应该是'www12ww3www4'
。
TEXT = 'aio__oo_ecc_'
INSERT = '1234'
insert = list(INSERT)
ret = ''
for char in TEXT:
if char == '_':
ret += insert[0]
insert.pop(0)
else:
ret += char
print (ret)
>> aio12oo3ecc4
这样做的正确方法是什么? 因为这似乎是效率最低的方式。
TEXT = 'aio__oo_ecc_'
INSERT = '1234'
it = iter(INSERT)
print("".join(next(it) if x == "_" else x for x in TEXT))
好处包括避免使用ret += char
Shlemiel the Painter 算法。 此外, pop(0)
需要将整个列表向前移动,因此它是线性的(最好是反转INSERT
并使用pop()
):
正如评论中所指出的,您可以直接使用str.replace
:
for c in INSERT:
TEXT = TEXT.replace('_', c, 1)
您也可以使用正则表达式替换:
import re
for c in INSERT:
TEXT = re.sub('_', c, TEXT, 1)
考虑用下划线分割模式字符串并用插入字符串压缩它:
TEXT = 'aio__oo_ecc_a' # '_a' added to illustrate the need for zip_longest
from itertools import zip_longest, chain
''.join(chain.from_iterable(zip_longest(TEXT.split('_'), INSERT, fillvalue='')))
#'aio12oo3ecc4a'
zip_longest
代替“正常” zip
以确保模式的最后一个片段(如果有)不会丢失。
一步一步的探索:
pieces = TEXT.split('_')
# ['aio', '', 'oo', 'ecc', 'a']
mix = zip_longest(pieces, INSERT, fillvalue='')
# [('aio', '1'), ('', '2'), ('oo', '3'), ('ecc', '4'), ('a', '')]
flat_mix = chain.from_iterable(mix)
# ['aio', '1', '', '2', 'oo', '3', 'ecc', '4', 'a', '']
result = ''.join(flat_mix)
速度对比:
您可以在re.sub
的替换函数中使用迭代器:
import re
TEXT = 'aio__oo_ecc_'
INSERT = '1234'
i = iter(INSERT)
print(re.sub('_', lambda _: next(i), TEXT))
这输出:
aio12oo3ecc4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.