Notepad++提取两字符间内容并按要求修改格式的方法
处理文本块的分步解决方案
针对你的需求,我会用Python来实现——它处理多行文本的逻辑更灵活,能轻松应对不同行数的情况。下面是具体的思路和代码:
核心思路
你已经用正则匹配到了####包裹的块,但要注意默认正则的.是不匹配换行的,所以需要开启跨行匹配模式来捕获中间的所有行。然后对中间的内容按行拆分,分别完成三个操作:
- 第一行末尾加问号
- 第二、三行开头加斜杠
- 把处理后的行重新拼接,再和前后的
####组合替换原内容
具体代码实现
import re # 读取目标文本文件 with open('your_input_file.txt', 'r', encoding='utf-8') as f: raw_content = f.read() # 定义正则,开启DOTALL模式让.匹配换行符 block_pattern = re.compile(r'(####)(.*?)(####)', re.DOTALL) def process_middle_content(match_obj): # 提取三个分组的内容 start_tag = match_obj.group(1) middle_lines = match_obj.group(2) end_tag = match_obj.group(3) # 拆分中间内容为行,保留每行的换行符(避免格式丢失) split_lines = middle_lines.splitlines(True) # 处理第一行:末尾添加问号 if split_lines: # 先去掉行尾换行,加问号后再补回换行 split_lines[0] = split_lines[0].rstrip('\n') + '?\n' # 处理第二、三行:开头加斜杠 # 循环索引1和2(对应第二、三行),同时判断行数是否足够 for line_idx in range(1, min(3, len(split_lines))): split_lines[line_idx] = '/' + split_lines[line_idx] # 重新拼接处理后的中间内容 processed_middle = ''.join(split_lines) # 返回完整的处理后块 return start_tag + processed_middle + end_tag # 替换所有匹配的文本块 final_content = block_pattern.sub(process_middle_content, raw_content) # 写入处理后的文件 with open('your_output_file.txt', 'w', encoding='utf-8') as f: f.write(final_content)
关键细节说明
re.DOTALL:确保正则表达式能跨行匹配,捕获####之间的所有内容,包括换行。splitlines(True):拆分时保留每行的换行符,这样处理后文本的换行格式不会混乱。- 边界处理:如果中间内容只有1行,就只处理第一行;如果有2行,就处理第一、二行,第三行不存在则跳过,避免报错。
如果你习惯用命令行工具,也可以用sed来实现(适合固定行数的场景),比如假设每个####块后刚好有3行内容:
sed -E ' /^####$/{ N s/(.*)\n(.*)/\1\n\2?/ N s/(.*)\n(.*)/\1\n\/\2/ N s/(.*)\n(.*)/\1\n\/\2/ }' your_input_file.txt > your_output_file.txt
内容的提问来源于stack exchange,提问作者Flashi
相关产品推荐
相关产品推荐

