繁体   English   中英

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

[英]Python - Remove All Occurences Of A Substring Within A String

我正在尝试创建的函数有 2 个主要的注意规则:

    1. 不允许使用模块
    1. 子字符串必须由“开始”和“结束”字符串获得。

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

例如: base 是"yes_and_no___yes_and_no" , begin 是"yes" , end 是"no"

输出: “yesno___yesno”

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

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

你的if有问题。 if extStr1 and extStr2 in baseStr没有按照您的想法执行。 您需要单独检查每个子字符串是否在基本字符串中,就像if extStr1 in baseStr and extStr2 in baseStr

我建议使用正则表达式和re.sub()而不是使用循环或递归

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

请记住escape()输入字符串,以防它们包含特殊字符。

接下来,我们用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'
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

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

您可以首先在每次出现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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM