如何用最Pythonic的方式移除日期字符串中的st/nd/rd/th后缀?
最Pythonic的日期序数后缀去除方法
首先得指出你原来代码里的小问题:循环里每次把替换结果赋值给a但没更新原字符串,最后只会保留最后一个后缀的替换效果;列表推导式取[0]也只处理了第一个后缀,其他的都没生效。
要一次性搞定所有st/nd/rd/th后缀,正则表达式是最Pythonic的方案——它能精准匹配数字后面的序数后缀,用一行代码完成所有替换,既简洁又高效。
示例代码
import re # 你的日期字符串列表 date_strings = [ 'Mar 1st 2017 00:00 am', 'Mar 2nd 2017 00:00 am', 'Mar 3rd 2017 00:00 am', 'Mar 4th 2017 00:00 am' ] # 核心正则替换逻辑 cleaned_dates = [re.sub(r'(?<=\d)(st|nd|rd|th)', '', date) for date in date_strings] # 输出结果 for cleaned in cleaned_dates: print(cleaned)
代码解释
(?<=\d):这是正向零宽断言,确保我们只替换紧跟在数字后面的后缀,避免误替换其他地方出现的st/nd等字符串(比如如果日期文本里有其他单词包含这些字符)。(st|nd|rd|th):匹配四种序数后缀中的任意一种,用|分隔表示“或”的逻辑。re.sub():一次性把所有匹配到的内容替换为空字符串,完成清理。
备选方案(不用正则)
如果你不想引入正则模块,也可以用循环链式替换,但效率略低(需要多次遍历字符串):
suffixes = ['st', 'nd', 'rd', 'th'] cleaned_date = 'Mar 1st 2017 00:00 am' for suffix in suffixes: cleaned_date = cleaned_date.replace(suffix, '') print(cleaned_date) # 输出: Mar 1 2017 00:00 am
但对比下来,正则表达式的方案更符合Python“简洁、高效”的风格,是处理这类模式匹配问题的最优解。
内容的提问来源于stack exchange,提问作者jacobcan118
相关产品推荐
相关产品推荐

