Python中如何用正则表达式查找数据集中不符合规范的异常日期
多分隔符字符串下异常日期识别方案
核心逻辑避开复杂反向正则,走「统一拆分片段→极简正向规则匹配标准格式→筛出异常」的路径,实现成本低、好调试。
- 第一步:一次性拆分所有混合分隔符的字符串
不需要逐个处理#/?/|/;//这类分隔符,直接把所有不属于「数字、字母、-/:/T(时间串允许的字符)」的符号全当成分隔符切分,切完过滤掉空片段即可。只需要一行极简的切分逻辑,不需要复杂正则:import re fragments = [f for f in re.split(r'[^0-9a-zA-Z:T-]', raw_string) if f] - 第二步:写零正则的标准格式判断函数
你需要的标准日期格式固定为20XX-XX-XXTXX:XX:XX,总长度19位,固定位置的字符完全确定,直接按位置判断即可,连正则都不用写:
如果后续需要加合法值校验(比如月份在1-12、日期在1-31这类),直接在函数里加数值判断即可,不需要调整复杂正则。def is_standard_datetime(s: str) -> bool: if len(s) != 19: return False # 按固定位置校验特征:20开头、横杠、T、冒号的位置完全匹配 return ( s.startswith("20") and s[4] == "-" and s[7] == "-" and s[10] == "T" and s[13] == ":" and s[16] == ":" ) - 第三步:批量捕获异常日期
遍历切分后的所有片段,先筛选出疑似时间串的片段(包含T且至少有2个冒号,对应时分秒结构),再用上面的判断函数校验,校验不通过的就是异常值。普通文本、纯数字片段因为不满足时间串特征,不会被误判。
完整可运行测试代码
import re def is_standard_datetime(s: str) -> bool: if len(s) != 19: return False return ( s.startswith("20") and s[4] == "-" and s[7] == "-" and s[10] == "T" and s[13] == ":" and s[16] == ":" ) def find_abnormal_datetime(raw_string: str) -> list: fragments = [f for f in re.split(r'[^0-9a-zA-Z:T-]', raw_string) if f] abnormal_list = [] for frag in fragments: # 先筛疑似时间串:带T且至少有两个冒号 if "T" in frag and frag.count(":") >= 2: if not is_standard_datetime(frag): abnormal_list.append(frag) return abnormal_list # 测试参考样本 test_sample1 = "0/0/Just/Some/2022-07-06T17:05:00/2022-07-06T19:25:00/Sample/6780/Data/in///my_Dataset" print(find_abnormal_datetime(test_sample1)) # 输出:[] (样本内两个日期均符合标准,无异常) # 测试带异常值的样本 test_sample2 = "xxx/+5002522-03-04T01:03:00|2023-01-01T12:00:00#wrong?2022-13-40T99:99:99" print(find_abnormal_datetime(test_sample2)) # 输出:['+5002522-03-04T01:03:00', '2022-13-40T99:99:99']
这个方案全程没有使用复杂的日期正则表达式,所有判断逻辑都是直白的字符、位置匹配,出问题排查成本极低,完全适配你当前20开头年份的数据集场景。
内容的提问来源于stack exchange,提问作者The Singularity
相关产品推荐
相关产品推荐

