从字符串中删除所有子字符串
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
。
然后用 ''
替换该特定组合。然后你重复。当再也找不到这样的组合时(即,当 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)
创建一个“无限”循环,一旦字符串没有出现来自 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)
我有一个字符串,我想从中删除所有可能的组合,直到最后。 我试过这个:
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
。
然后用 ''
替换该特定组合。然后你重复。当再也找不到这样的组合时(即,当 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)
创建一个“无限”循环,一旦字符串没有出现来自 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)