繁体   English   中英

用给定的字符串替换字符串的字符

[英]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)

见这里: https : //docs.python.org/3/library/re.html

考虑用下划线分割模式字符串并用插入字符串压缩它:

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)

速度对比:

  1. 此解决方案:每个循环 1.32 µs ± 9.08 ns
  2. 迭代器 + 三元 + 列表理解:每个循环 1.77 µs ± 20.8 ns
  3. 原始解决方案:每个循环 2 µs ± 13.2 ns
  4. 循环 + 正则表达式解决方案:每个循环 3.66 µs ± 103 ns

您可以在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM