Python去除字符串中双引号内非字母数字字符及保留指定双引号内容的实现求助
Python去除字符串中双引号内非字母数字字符及保留指定双引号内容的实现求助
嘿,我来帮你搞定这个需求!你的目标很清晰:要保留"prompt engineering"、"i.e."、"1"这些带双引号的内容,删掉那些双引号里只有非字母数字字符(比如空格、逗号,甚至空内容)的整个双引号块。
先给你一个更简洁高效的方案——用正则表达式的替换回调函数,一步到位处理:
import re answer_result = 'I don’t think we’ll still be doing "prompt engineering" in five years "i.e." figuring out how to hack the prompt by " ," adding one magic word to the "" end that changes everything else. " What will always matter is the "1" quality of ideas.' # 定义需要保留的双引号内的内容集合 keep_content = {"prompt engineering", "i.e.", "1"} def replace_quotes(match): # 提取双引号包裹的内容(去掉前后引号) content = match.group(1) # 如果内容在保留列表里,就返回原双引号格式的内容;否则返回空字符串(删除该双引号块) return f'"{content}"' if content in keep_content else '' # 匹配所有双引号对,用回调函数处理每一处匹配 processed_text = re.sub(r'"(.*?)"', replace_quotes, answer_result) # 清理掉删除双引号后可能出现的连续空格 processed_text = re.sub(r'\s+', ' ', processed_text).strip() print(processed_text)
代码解释:
- 用
r'"(.*?)"'做非贪婪匹配,能精准找到每一对双引号及其内部的内容,避免匹配到跨多个双引号的内容; - 回调函数
replace_quotes会判断每一处双引号内的内容是否在我们预设的保留集合里,是就保留原格式,否则直接删除整个双引号块; - 最后用正则清理连续空格,让结果更整洁,和你想要的输出完全一致。
如果你想继续用自己最初的思路(通过双引号索引来处理),也可以试试下面的后续步骤:
# 基于你现有代码的后续处理逻辑 text_list = list(answer_result) # 注意要从后往前删除区间,不然前面的删除会打乱后面的索引 for start, end in reversed(to_be_deleted): del text_list[start:end+1] # 处理可能存在的单个未配对的双引号 for pos in reversed(single_quotes): del text_list[pos] # 拼接回字符串并清理空格 processed_text = ''.join(text_list) processed_text = re.sub(r'\s+', ' ', processed_text).strip()
不过这种方法需要手动处理索引顺序,容易出错,还是推荐第一种正则回调的方案,代码更简洁可读性也更强。
试试上面的代码,应该就能得到你期望的输出啦!
备注:内容来源于stack exchange,提问作者usr_lal123
相关产品推荐
相关产品推荐

