Python正则表达式匹配:获取最后一个含下划线单词之前的内容
解决Python正则匹配到最后一个带下划线单词前内容的问题
需求明确
要匹配字符串中最后一个包含下划线的单词之前的所有内容,允许保留前面其他带下划线的单词(只要不是最后一个):
- 示例1输入:
13wfe + 123dg Text ldf_dfdlj_dfldjf_dfs test 123→ 期望结果:13wfe + 123dg Text - 示例2输入:
13wfe + 123dg Tetest_xt ldf_dfdlj_dfldjf_dfs test 123→ 期望结果:13wfe + 123dg Tetest_xt
问题分析
- 最初尝试的
^.*?(?=_)是非贪婪匹配到第一个下划线,因此会卡在第一个带下划线单词的中间(如示例1中匹配到13wfe + 123dg Text ldf),完全不符合需求。 - 之前使用的正则出现多段匹配,是因为未限定匹配到最后一个带下划线单词,全局匹配时会捕获多个符合局部条件的片段。
解决方案
使用以下正则表达式,通过正向预查或捕获组锁定最后一个带下划线单词的位置:
import re # 方案1:正向预查匹配,后续可strip去除首尾空格 pattern = r'^.*?(?=\s+\S*_\S*(?:\s+\S+)*$)' text = " 13wfe + 123dg Tetest_xt ldf_dfdlj_dfldjf_dfs test 123" match = re.match(pattern, text) if match: result = match.group().strip() print(result) # 输出: 13wfe + 123dg Tetest_xt # 方案2:捕获组直接提取去开头空格的结果 pattern = r'^\s*(.*?)\s+\S*_\S*(?:\s+.*)?$' match = re.match(pattern, text) if match: print(match.group(1)) # 输出: 13wfe + 123dg Tetest_xt
正则解释
- 方案1正则
^.*?(?=\s+\S*_\S*(?:\s+\S+)*$):^:匹配字符串开头.*?:非贪婪匹配任意字符,直到满足后续正向预查条件(?=\s+\S*_\S*(?:\s+\S+)*$):正向预查,确保后方是「至少一个空白 + 含下划线的单词 + 任意多组空白+普通单词 + 字符串结尾」,精准锁定最后一个带下划线单词的位置
- 方案2正则
^\s*(.*?)\s+\S*_\S*(?:\s+.*)?$:通过捕获组跳过开头空格,直接提取目标内容,无需额外处理首尾空格。
内容的提问来源于stack exchange,提问作者Tony Montana
相关产品推荐
相关产品推荐

