Python正则表达式:如何排除字符串最后三个单词?
问题需求
- 处理一个由至少4个单词组成的字符串,单词间用空格分隔(来自Linux下
nmcli命令的输出) - 单词之间可能存在多个连续空格
- 需要编写Python函数,获取字符串开头部分,排除最后三个单词,且保留原有的空格格式(如示例3中保留word1和word2之间的3个空格)
示例说明
1) input_string = "word1 word2 word3 word4" ----- |--> 函数返回 'word1' 2) input_string = "word1 word2 word3 word4 word5" ----------- |--> 函数返回 'word1 word2'(word1和word2之间仅一个空格) 3) input_string = "word1 word2 word3 word4 word5" -------------- |--> 函数返回 'word1 word2'(word1和word2之间保留原有的3个空格)
现有代码问题
尝试的代码如下,该代码在示例1、2中有效,但示例3中会把多个空格压缩成单个,无法保留原空格格式:
def func(input_string): input_string = " ".join(input_string.split()) l = len(input_string) start_string = input_string[0] if l > 4: i = 1 start_string += ' ' while i < l - 3: start_string += input_string[i] i += 1 if i == l - 3: break else: start_string += ' ' return start_string
解决方案:正则表达式实现
可以使用正则表达式匹配并捕获最后三个单词之前的内容,同时保留原始空格。以下是两种可行实现:
实现方式一:分组捕获
import re def get_prefix_exclude_last_three_words(input_string): # 匹配任意内容,直到最后三个由空格分隔的单词(允许多空格) pattern = r'^(.*?)\s+(?:\S+\s+){2}\S+$' match = re.match(pattern, input_string.strip()) if match: return match.group(1) # 处理刚好4个单词的情况,返回第一个单词 pattern_4_words = r'^(\S+)\s+(?:\S+\s+){2}\S+$' match_4 = re.match(pattern_4_words, input_string.strip()) if match_4: return match_4.group(1) return input_string # 按题目要求输入至少4个单词,此异常情况可忽略
正则逻辑解释
^:匹配字符串开头(.*?):非贪婪模式捕获前缀内容,保留原始空格\s+:匹配一个或多个连续空格(?:\S+\s+){2}:非捕获组,匹配两个「单词+多空格」的组合\S+$:匹配最后一个单词,直到字符串结尾
实现方式二:正向预查(更简洁)
import re def get_prefix_exclude_last_three_words(input_string): # 正向预查匹配最后三个单词的位置,捕获之前的内容 pattern = r'^(.*?)(?=\s+\S+\s+\S+\s+\S+$)' match = re.search(pattern, input_string.strip()) if match: result = match.group(1) # 处理刚好4个单词时的末尾空格问题 return result.rstrip() if result.endswith(' ') else result return input_string
测试示例3:
input_str = "word1 word2 word3 word4 word5" print(get_prefix_exclude_last_three_words(input_str)) # 输出 'word1 word2'
内容的提问来源于stack exchange,提问作者User051209
相关产品推荐
相关产品推荐

