Python正则匹配问题:\w+在代码中无法匹配字母类单词的解决方法
问题分析与修复方案
你的问题核心在于正则表达式的使用逻辑错误,导致字母类单词无法被匹配到,咱们一步步拆解解决:
错误根源
你用re.findall('\w+', fitur[0]) == fitur[0]来判断是否为字母单词,这完全不成立——re.findall()返回的是匹配结果的列表(哪怕只匹配到一个内容,也是['xxx']这样的列表),而fitur[0]是单个字符串。比如fitur[0]是angkasa时,re.findall返回['angkasa'],列表和字符串直接用==比较永远是False,自然不会选中这些字母项。
修复方案
我们需要换一种正确的方式判断字符串格式,同时还能简化你那一大串Fxx的判断逻辑:
1. 用正确的正则匹配方法
用re.fullmatch()替代re.findall(),它会检查整个字符串是否完全符合正则模式:匹配成功返回匹配对象(在if条件中视为True),失败返回None(视为False)。
2. 简化F开头编号的判断
原来一堆or的判断可以用正则r'F\d+'直接匹配所有「F+数字」的格式,代码瞬间简洁很多。
修正后的完整代码
import re def MultiTrain(self): for fitur in self.fiturs: # 判断是否是F开头的数字编号,或是字母/字母数字组成的单词 is_f_serial = re.fullmatch(r'F\d+', fitur[0]) # 匹配F7、F37这类格式 is_word = re.fullmatch(r'\w+', fitur[0]) # 匹配字母、数字、下划线组成的单词 if is_f_serial or is_word: print(fitur)
如果你只想匹配纯字母的单词(不含数字和下划线),可以把is_word的正则改成:
is_word = re.fullmatch(r'[a-zA-Z]+', fitur[0])
效果验证
修正后,你的待匹配内容里angkasa、action、acu、ampun这些项都会被正确识别,输出完全符合你的期望。
内容的提问来源于stack exchange,提问作者Fachrul Rozy Saputra R
相关产品推荐
相关产品推荐

