从字符串中删除所有子字符串

remove all sub-strings from a string

我有一个字符串,我想从中删除所有可能的组合,直到最后。 我试过这个:

combinations = ['XY', 'ZU', 'YY']
lst_matched = list(filter(lambda val: val in mystring, combinations))
for i in matches:
    if len(mystring) > 0:
        mystring = mystring.replace(i,'')
        print('after', mystring)

如果我将它与 mystring 一起使用,例如 ZXYUYY,它会将 lst_matched 识别为 [XY, YY],并且我的函数会正确地从 [=15= 中删除这些子字符串].

但是,删除这些子字符串后,更新后的字符串现在有 ZU这也是要检查的另一个组合。

如何修改我的代码,使其搜索所有可能的组合,直到没有匹配项为止?可以使用递归,但不确定如何使用。

试试这个:

def replace(mystring, combinations):
    val = next((val for val in combinations if val in mystring), None)
    while val is not None:
        mystring = mystring.replace(val, '')
        val = next((val for val in combinations if val in mystring), None)
    return mystring

基本上你会找到第一个可以在mystring中找到的组合(这可以用next((val for val in combinations if val in mystring), None)来完成)。如果找不到这样的组合,那么 val 将是 None

然后用 '' 替换该特定组合。然后你重复。当再也找不到这样的组合时(即,当 valNone 时)。

示例:

>>> replace('ZXYUYY', ['XY', 'ZU', 'YY'])
''
>>> replace('ZXYUYY', ['XY', 'YY'])
'ZU'
>>> replace('AZXYUYY', ['XY', 'ZU', 'YY'])
'A'
>>> replace('AZBXYUYY', ['XY', 'ZU', 'YY'])
'AZBU'

只需重复替换,直到生成的字符串与原始字符串相同:

combinations = ['XY', 'YY', 'ZU']
mystring = 'ZXYUYY'
while True:
    new_string = mystring
    for combination in combinations:
        new_string = new_string.replace(combination, '')
    if new_string == mystring:
        break
    mystring = new_string
print(mystring)

或者更简单地使用正则表达式:

import re

regex = re.compile('XY|YY|ZU')
mystring = 'ZXYUYY'
while True:
    mystring, substitutions = regex.subn(mystring, '')
    if not substitutions:
        break
print(mystring)

创建一个“无限”循环,一旦字符串没有出现来自 remove_list(即您的 combinations 列表)

的字符串,该循环就会退出
remove_list = ['XY', 'YY', 'ZU'] 

s = "ZXYUYY"
while True:
    if any(i in s for i in remove_list):
        for j in remove_list:
            s = s.replace(j, "")
    break
print(s)

您可以遍历“组合”的排列:

from itertools import permutations
mystring = "ZXYUYY"
combinations = ['ZU', 'XY', 'YY']
for p in permutations(combinations, len(combinations)):
    for c in p:
        mystring = mystring.replace(c, "")
        print('after', mystring)
print(mystring)