![](/img/trans.png)
[英]Python Regex: Extract all occurences of a substring within a string
[英]Python - Remove All Occurences Of A Substring Within A String
我正在尝试创建的函数有 2 个主要的注意规则:
- 不允许使用模块
- 子字符串必须由“开始”和“结束”字符串获得。
目的是获取基础、开始和结束字符串。 然后,删除这些字符串之间的所有文本。 这必须针对每一次出现,而不仅仅是第一次。
例如: 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.