请求修改Python正则表达式,匹配时排除最后一个单词
解决方案
首先分析你现有正则的问题:.*\w(?=\s+\w+-) 使用了贪婪匹配的 .*,会尽可能匹配到最后一个满足 (?=\s+\w+-)(即后面跟着空格+单词字符+连字符)的位置,所以当字符串中存在多个带连字符的单词时,就会匹配超出预期的内容。
根据你的预期结果,需求应该是匹配从字符串开头到第一个带连字符的单词的全部内容,后续所有内容都排除。可以用以下正则实现:
^.*?\w+-[^-\s]*
正则解释:
^:锚定字符串开头,确保从起始位置开始匹配.*?:非贪婪模式匹配任意字符,会在找到第一个符合后续条件的内容时停止\w+-:匹配一个或多个单词字符(字母、数字、下划线)后跟连字符,定位带连字符单词的起始部分[^-\s]*:匹配除连字符和空格之外的任意字符,完整捕获带连字符的整个单词(直到遇到空格为止)
测试验证:
- 输入字符串:
13wfe + 123dg Tetest-xt ldf-dfdlj-dfldjf-dfs test
匹配结果:13wfe + 123dg Tetest-xt(符合预期) - 输入字符串:
13wfe + 123dg Tetest-xt ldf-dfdlj-dfldjf-dfs test-test
匹配结果:13wfe + 123dg Tetest-xt(符合预期)
如果你的实际需求是仅排除字符串的最后一个单词(不管中间内容),可以使用以下正则:
.*(?=\s+\S+$)
正则解释:
.*:贪婪匹配任意字符(?=\s+\S+$):正向预查,匹配后面跟着一个或多个空格+非空格字符(最后一个单词)直到字符串结尾的位置
不过这个正则的匹配结果会包含ldf-dfdlj-dfldjf-dfs,不符合你给出的预期,所以更推荐第一个方案。
内容的提问来源于stack exchange,提问作者Tony Montana
相关产品推荐
相关产品推荐

