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

问题描述 投票:0回答:4

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

我试过这个:

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]
,并且我的函数将正确地从
mystering
中删除这些子字符串。

但是,删除这些子字符串后,更新后的字符串现在具有

ZU
,这也是要检查的另一个组合。

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

python python-3.x string replace
4个回答
1
投票

试试这个:

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

然后用

''
替换该特定组合。你重复一遍。当再也找不到这样的组合时(即,当
val
None
时),您就停止。

示例:

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

0
投票

只需重复替换,直到结果字符串与原始字符串相同:

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)

0
投票

您可以循环“组合”的排列:

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)

0
投票

创建一个“无限”循环,一旦字符串中没有出现

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)
© www.soinside.com 2019 - 2024. All rights reserved.