我有一个字符串,我想从中删除所有可能的组合直到最后。
我试过这个:
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
,这也是要检查的另一个组合。
如何修改我的代码,以便它搜索所有可能的组合,直到没有匹配项为止?可以使用递归,但不确定如何使用。
试试这个:
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'
只需重复替换,直到结果字符串与原始字符串相同:
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)
您可以循环“组合”的排列:
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)
创建一个“无限”循环,一旦字符串中没有出现
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)