Python删除字符串中出现的所有子字符串

2024-09-28 20:50:35 发布

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

对于我尝试创建的函数,有两个主要的注意规则:

    1. No use of modules are allowed
    1. The substring must be obtained by a 'begin' and 'end' string.

目的是获取一个基字符串、开始字符串和结束字符串。然后,删除这些字符串之间的所有文本。这必须针对每次事件,而不仅仅是第一次

例如: 基础是“是”和“否”“是”和“否”, 开始是“是”, 结束语是“否”

输出:“是的”

到目前为止,这是我的代码,但是它只适用于第一次出现。递归实现是否理想

def extractFromString(baseStr, extStr1, extStr2):
    if extStr1 and extStr2 in baseStr:
        # >1. Get start/end indices
        start = baseStr.find(extStr1) + len(extStr1)
        end = baseStr.find(extStr2)
        
        # >2. Get first/second halves
        firstHalf = baseStr[:start]
        secondHalf = baseStr[end:]

        # >3. Combine and return
        result = firstHalf + secondHalf
        return result

Tags: and函数字符串getreturn规则resultfind
3条回答

您可以在每次出现extStr2时首先拆分基本字符串,然后在出现extStr1时拆分它

def extractFromString(baseStr, extStr1, extStr2):
    final_str= ""
    if extStr1 and extStr2 in baseStr:
        base_subStr= baseStr.split(extStr2) 
        for index in range(0,len(base_subStr)):
            if extStr1 not in base_subStr[index]:   
                final_str= final_str + base_subStr[index]
            else:
                final_str= final_str + base_subStr[index].split(extStr1)[0] + extStr2

我没有运行这个,但这可能适用于你的情况

extStr1 = "yes"
extStr2 = "no"

def extractFromString(baseStr, extStr1, extStr2):
    if extStr1 in baseStr and extStr2 in baseStr:
        # >1. Get start/end indices
        start = baseStr.find(extStr1) + len(extStr1)
        end = baseStr.find(extStr2, start)
        if end == -1:
            return baseStr
        processStr = baseStr[:end+len(extStr2)]
        queueStr = baseStr[end+len(extStr2):]

        firstHalf = processStr[:start]
        secondHalf = processStr[end:]
        processStr = firstHalf + secondHalf

        return processStr + extractFromString(queueStr, extStr1, extStr2)
    else:
        return baseStr

for exampleStr in exampleStrs:
    print("input:")
    print(exampleStr)
    print("output:")
    print(extractFromString(exampleStr, extStr1, extStr2))
    print("\n")

提供以下输出:

input:
yes_and_no___yes_and_no
output:
yesno___yesno


input:
aha_no_yes_deleteThis_no_no_no_yes
output:
aha_no_yesno_no_no_yes


input:
yes_yes_aha_no_no_yes_no_no
output:
yesno_no_yesno_no


input:
yes_yes_no_no
output:
yesno_no

这是通过拆分字符串并递归调用函数来实现的。 检查最后一个例子,如果这是您想要的行为

你的if有问题if extStr1 and extStr2 in baseStr不会做你认为它会做的事。您需要检查每个子字符串是否分别位于基本字符串if extStr1 in baseStr and extStr2 in baseStr

我建议不要使用循环或递归,而是使用正则表达式和^{}

首先,我们构建一个正则表达式来匹配yes,然后尽可能少地匹配任何字符,然后no:yes.*?no{a2}

记住^{}输入字符串,以防它们包含特殊字符

接下来,我们用yesno替换所有出现的这个正则表达式

import re

def extractFromString(baseStr, extStr1, extStr2):
    rexp = re.compile(f"{re.escape(extStr1)}.*?{re.escape(extStr2)}")
    return re.sub(rexp, extStr1 + extStr2, baseStr)

用一堆输入运行这个

extractFromString("yes_and_no___yes_and_no", "yes", "no")
# Output: 'yesno___yesno'

extractFromString("aha_no_yes_deleteThis_no_no_no_yes", "yes", "no")
# Output: 'aha_no_yesno_no_no_yes'

extractFromString("yes_yes_aha_no_no_yes_no_no", "yes", "no")
# Output: 'yesno_no_yesno_no'

extractFromString("yes_yes_no_no", "yes", "no")
# Output: 'yesno_no'

相关问题 更多 >