Python中的字符串覆盖优化

2024-04-26 09:00:41 发布

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

我有这个初始字符串。在

'bananaappleorangestrawberryapplepear'

还有一个包含字符串的元组:

^{pr2}$

我需要一个函数,以便从初始字符串和带有字符串的元组中获得:

'bananaxxxxxxxxxgestrawberryxxxxxxxar'

我知道如何在每个单词的初始字符串中查找单词,然后用替换的单词在所有初始字符串中逐个字符循环。在

但效率不高,而且很难看。我怀疑应该有某种方法可以更优雅地使用itertools或其他工具来实现这一点。如果你知道一个Python库可以有效地做到这一点,请告诉我。在

更新:Justin Peel指出了一个我在最初的问题中没有描述的案例。如果单词是“aaa”并且“aaaaaa”在初始字符串中,则输出应该类似于“xxxxxx”。在


Tags: 工具方法函数字符串字符单词案例元组
3条回答
import re

words = ('apple', 'plepe', 'leoran', 'lemon')
s = 'bananaappleorangestrawberryapplepear'

x = set()

for w in words:
    for m in re.finditer(w, s):
        i = m.start()
        for j in range(i, i+len(w)):
            x.add(j)

result = ''.join(('x' if i in x else s[i]) for i in range(len(s)))
print result

产生:

^{pr2}$

假设我们只能在没有stdlib和其他进口产品的情况下工作:

s1 = 'bananaappleorangestrawberryapplepear'
t = ('apple', 'plepe', 'leoran', 'lemon')
s2 = s1

solution = 'bananaxxxxxxxxxgestrawberryxxxxxxxar'

for word in t:
    if word not in s1: continue
    index = -1 # Start at -1 so our index search starts at 0
    for iteration in range(s1.count(word)):
        index = s1.find(word, index+1)
        length = len(word)
        before = s2[:index]
        after = s2[index+length:]
        s2 = before + 'x'*length + after

print s2 == solution

这是另一个答案。也许有一种更快的方法可以用x来代替字母,但我不认为这是必要的,因为这已经相当快了。在

import re

def do_xs(s,pats):
    pat = re.compile('('+'|'.join(pats)+')')

    sout = list(s)
    i = 0
    match = pat.search(s)
    while match:
        span = match.span()
        sout[span[0]:span[1]] = ['x']*(span[1]-span[0])
        i = span[0]+1
        match = pat.search(s,i)
    return ''.join(sout)

txt = 'bananaappleorangestrawberryapplepear'
pats = ('apple', 'plepe', 'leoran', 'lemon')
print do_xs(txt,pats)

基本上,我创建一个regex模式,它将匹配任何输入模式。然后在最近一次比赛的开始位置后,我继续重新启动搜索。但如果其中一个输入模式是另一个输入模式的前缀,则可能会出现问题。在

相关问题 更多 >