Python如何从部分子串匹配中返回完整匹配单词并生成列表?
解决方法:返回包含指定子串的完整单词
你的问题根源在于当前正则只匹配目标子串本身,findall自然只会返回这些子串片段。要获取包含这些子串的完整单词,有两种简洁的修改思路:
方法一:拆分单词后筛选(直观易读)
先把文本拆分成单个单词,然后逐一检查每个单词(忽略大小写)是否包含任意目标子串,最后收集符合条件的原单词:
def latin_ish_words(text): import re # 定义需要匹配的子串模式 target_patterns = ["tion", "ex", "ph", "ost", "ast", "ist"] # 拆分出原文本中的所有单词 original_words = text.split() # 筛选:单词小写后包含任意目标子串,就保留原单词 matching_words = [ word for word in original_words if any(pattern in word.lower() for pattern in target_patterns) ] return matching_words # 测试 print(latin_ish_words("This functions as expected")) # 输出: ['functions', 'expected']
方法二:改进正则匹配整个单词(简洁高效)
调整正则表达式,让它匹配包含任意目标子串的完整单词,配合re.IGNORECASE忽略大小写:
def latin_ish_words(text): import re # 正则逻辑:匹配任意包含目标子串的单词,\b 表示单词边界,(?:...) 是非捕获组 pattern = re.compile(r'\b\w*(?:tion|ex|ph|ost|ast|ist)\w*\b', re.IGNORECASE) # findall 现在会返回完整的匹配单词 matches = pattern.findall(text) return matches # 测试 print(latin_ish_words("This functions as expected")) # 输出: ['functions', 'expected']
补充说明
- 如果你的文本中包含带标点的单词(比如
functions,),可以调整正则的单词边界逻辑,比如把\b替换为更宽松的匹配,或者先清理文本中的标点再处理。 - 两种方法都能实现需求:第一种更适合新手理解,第二种在处理复杂文本时更灵活。
内容的提问来源于stack exchange,提问作者tnsoom
相关产品推荐
相关产品推荐

