Linux下Sed截取匹配正则后的字符串及Python实现方案
问题描述
我有完整字符串:"^aloha_lang.maui_island_A_rams.blue.lagoon$",需要用正则表达式"maui_.*_rams"匹配,匹配成功后删除匹配部分之前的所有内容,期望输出:"^maui_island_A_rams.blue.lagoon$"。我尝试了命令 echo "^aloha_lang.maui_island_A_rams.blue.lagoon$" | sed 's/^[^maui_.*_rams]*//;p' 但没得到正确结果,求正确的Sed单行命令或Python正则实现方式?
解决方案
Sed单行命令
你之前的错误在于 [^maui_.*_rams] 是字符集匹配,而非正则模式匹配——它只会匹配不属于m、a、u、i、_、.、*、r、s这些单个字符的内容,逻辑完全不符合需求。
推荐两种正确写法:
- 捕获目标模式及后续内容,替换掉开头到目标模式前的部分:
echo "^aloha_lang.maui_island_A_rams.blue.lagoon$" | sed 's/^.*\(maui_.*_rams.*\)/\1/'
- 更简洁的写法,直接保留从
maui_开始到结尾的内容:
echo "^aloha_lang.maui_island_A_rams.blue.lagoon$" | sed 's/^.*maui_/maui_/'
Python正则实现
方式一:用替换删除前缀
import re original_str = "^aloha_lang.maui_island_A_rams.blue.lagoon$" # 匹配开头到目标模式前的所有内容,替换为空 result = re.sub(r'^.*(?=maui_.*_rams)', '', original_str) print(result)
方式二:直接捕获目标及后续内容
import re original_str = "^aloha_lang.maui_island_A_rams.blue.lagoon$" match_obj = re.search(r'(maui_.*_rams.*)$', original_str) if match_obj: print(match_obj.group(1))
内容的提问来源于stack exchange,提问作者Vimo
相关产品推荐
相关产品推荐

