You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:17:36