求两种标记间文本提取的sed正则表达式及Python re实现
标记间文本提取方案
示例文本
^[[200~a^[[200~aaa aM1bb bbbM1ccc[$cM2ddddM2eeeeeM3ffffff fM3ggggggg M3hhhhh hhM3kkkkk~
需求1:提取第一个M1至最后一个M3之间的文本
目标结果:bb bbbM1ccc[$cM2ddddM2eeeeeM3ffffff fM3ggggggg M3hhhhh hh
sed 命令
echo "^[[200~a^[[200~aaa aM1bb bbbM1ccc[\$cM2ddddM2eeeeeM3ffffff fM3ggggggg M3hhhhh hhM3kkkkk~" | sed -E 's/^.*?M1//; s/M3.*$//'
- 说明:
^.*?M1非贪婪匹配开头到第一个M1的内容并删除;M3.*$匹配最后一个M3到结尾的内容并删除,保留中间部分。
Python re 表达式
import re text = "^[[200~a^[[200~aaa aM1bb bbbM1ccc[$cM2ddddM2eeeeeM3ffffff fM3ggggggg M3hhhhh hhM3kkkkk~" match_result = re.search(r'^.*?M1(.*)M3.*$', text, re.DOTALL) if match_result: print(match_result.group(1))
- 说明:
^.*?M1非贪婪匹配到第一个M1;(.*)贪婪匹配到最后一个M3前的所有内容;re.DOTALL确保.匹配换行符(适配含换行的文本场景)。
需求2:提取最后一个M1至第一个M3之间的文本
目标结果:ccc[$cM2ddddM2eeeee
sed 命令
echo "^[[200~a^[[200~aaa aM1bb bbbM1ccc[\$cM2ddddM2eeeeeM3ffffff fM3ggggggg M3hhhhh hhM3kkkkk~" | sed -E 's/.*M1//; s/M3.*//'
- 说明:
.*M1贪婪匹配开头到最后一个M1的内容并删除;M3.*匹配第一个M3到结尾的内容并删除,保留中间部分。
Python re 表达式
import re text = "^[[200~a^[[200~aaa aM1bb bbbM1ccc[$cM2ddddM2eeeeeM3ffffff fM3ggggggg M3hhhhh hhM3kkkkk~" match_result = re.search(r'.*M1(.*?)M3', text, re.DOTALL) if match_result: print(match_result.group(1))
- 说明:
.*M1贪婪匹配到最后一个M1;(.*?)非贪婪匹配到第一个M3前的所有内容;re.DOTALL适配含换行的文本场景。
内容的提问来源于stack exchange,提问作者Ramanan T
相关产品推荐
相关产品推荐

