使用正则表达式生成英文首字母缩写时文本重复问题如何解决
问题原因及修正方案
错误原因
你对re.sub方法的传参逻辑理解有误:re.sub(匹配规则, 替换内容, 原字符串)中,如果替换内容传固定字符串,会把每一个匹配到的子串都替换成这个完整的固定字符串。
你的正则r'(\b\w)'可以匹配到Data的首字母D和Science的首字母S两个结果,你传入的替换内容是some_words.upper()生成的固定值DATA SCIENCE,替换逻辑如下:
- 原字符串第一个匹配到的
D被替换为DATA SCIENCE,剩余未匹配的ata Science保留 - 后续匹配到的
S被替换为DATA SCIENCE,剩余未匹配的cience保留
最终拼接后就得到了你看到的重复输出DATA SCIENCEata DATA SCIENCEcience。
修正代码
场景1:预期输出全大写的DATA SCIENCE
如果不需要强制用正则,直接调用字符串内置方法即可:
some_words = 'Data Science' print(some_words.upper())
如果必须通过正则实现,将替换内容改为lambda函数处理每个匹配结果即可:
import re some_words = 'Data Science' all_words_select = r'\b\w' word_upper = re.sub(all_words_select, lambda match: match.group().upper(), some_words) print(word_upper)
场景2:实现最初的首字母缩写生成需求(输入Data Science输出DS)
用re.findall匹配所有单词首字母后拼接转大写即可:
import re some_words = 'Data Science' # 提取所有单词首字母 first_letter_list = re.findall(r'\b\w', some_words) # 转大写后拼接得到缩写 abbreviation = ''.join(first_letter_list).upper() print(abbreviation)
内容的提问来源于stack exchange,提问作者DejaVu
相关产品推荐
相关产品推荐

