影刀RPA 常见数据格式校验身份证、手机号、邮箱、URL的验证套路数据采集完了不等于数据就是对的。用户填的表单数据、网页上采集的信息、API返回的字段——这些数据里混着大量格式错误的内容。如果不校验就写入数据库或发给下游系统后果可能是整批数据被拒收。这篇文章给出四种最常见的数据格式校验方案附带正则表达式模板拿来就能用。校验的目的分层不是所有校验都要做到100%准确。先想清楚你的场景第一层格式校验。手机号是不是11位数字、邮箱里有没有符号。这一层只管长得像不像不管是不是真的。适合数据清洗的第一步——先把明显不对的过滤掉。第二层业务逻辑校验。日期不能是未来的、金额不能是负数、订单号必须符合公司编码规则。这一层是在格式正确的基础上检查数据是否合理。第三层真实性校验。手机号能不能打通、邮箱是否存在、身份证号码的校验位对不对。这一层需要外部系统配合最高成本也最高。拼多多店群自动化上架方案大部分RPA场景做到第一层第二层就够了。第三层除非业务强需求否则投入产出比不高。手机号校验importredefvalidate_phone(phone):校验中国大陆手机号格式ifnotphone:returnFalse,手机号为空phonestr(phone).strip()# 去掉可能存在的86前缀ifphone.startswith(86):phonephone[3:]# 1开头第二位3-9总共11位patternr^1[3-9]\d{9}$ifre.match(pattern,phone):returnTrue,phoneelse:returnFalse,f手机号格式不正确:{phone}注意号段在不断更新比如广电的192号段上面这个正则用[3-9]覆盖了目前所有号段。身份证号校验身份证校验分两步格式校验 校验位计算。importrefromdatetimeimportdatetimedefvalidate_id_card(id_number):校验中国大陆18位身份证号ifnotid_number:returnFalse,身份证号为空id_strstr(id_number).strip().upper()# 1. 格式17位数字 1位数字或Xifnotre.match(r^\d{17}[\dX]$,id_str):returnFalse,格式不正确需18位# 2. 出生日期校验try:birthdatetime.strptime(id_str[6:14],%Y%m%d)ifbirth.year1900orbirthdatetime.now():returnFalse,出生日期不合理except:returnFalse,出生日期无效# 3. 校验位计算weights[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]check_chars10X98765432totalsum(int(id_str[i])*weights[i]foriinrange(17))expected_checkcheck_chars[total%11]ifid_str[-1]!expected_check:returnFalse,f校验位不正确期望{expected_check}# 4. 提取信息info{地区码:id_str[:6],出生日期:birth.strftime(%Y-%m-%d),性别:男ifint(id_str[16])%21else女,}returnTrue,info第17位索引16奇数为男性偶数为女性。邮箱校验importredefvalidate_email(email):校验邮箱格式ifnotemail:returnFalse,邮箱为空emailstr(email).strip()# 基本格式校验patternr^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$ifnotre.match(pattern,email):returnFalse,邮箱格式不正确# 额外检查if..inemail:returnFalse,邮箱包含连续的点ifemail.count()!1:returnFalse,邮箱符号数量不正确returnTrue,email注意这个正则覆盖了99%的合法邮箱格式。但RFC 5322定义的合法邮箱格式远比这个复杂比如可以用引号包裹、支持特殊字符。对于RPA场景上述正则够用了——你采集回来的数据里很少出现那种极端格式的邮箱。URL校验importrefromurllib.parseimporturlparsedefvalidate_url(url):校验URL格式ifnoturl:returnFalse,URL为空urlstr(url).strip()# 补全协议如果没有的话ifnoturl.startswith((http://,https://)):urlhttps://url[video(video-hqtqq1SJ-1784060314069)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营)]try:resulturlparse(url)# 必须有scheme和netlocifall([result.scheme,result.netloc]):# netloc必须有至少一个点域名if.inresult.netloc:returnTrue,urlreturnFalse,URL格式不完整except:returnFalse,URL解析失败把校验串成数据清洗流程# 完整的数据记录校验 defvalidate_record(record,rules): record: 字典 {phone: 13800138000, email: testexample.com, ...} rules: 字典 {phone: validate_phone, email: validate_email, ...} 返回: (is_valid, errors) errors[]forfield,validatorinrules.items():valuerecord.get(field)valid,resultvalidator(value)ifnotvalid:errors.append({field:field,value:value,error:result})returnlen(errors)0,errors# 使用示例rules{phone:validate_phone,email:validate_email,id_card:validate_id_card,}data[{phone:13800138000,email:zhangexample.com,id_card:110101199001011234},{phone:12345,email:bad-email,id_card:123456789012345678},]valid_records[]invalid_records[]forrecordindata:is_valid,errorsvalidate_record(record,rules)ifis_valid:valid_records.append(record)else:record[_errors]errors invalid_records.append(record)print(f有效数据{len(valid_records)}条)print(f无效数据{len(invalid_records)}条)forrininvalid_records:print(f 原始数据{r})foreinr[_errors]:print(f{e[field]}:{e[error]})在影刀流程中集成采集流程中的校验步骤 1. 【读取Excel】→ 读取采集到的数据 2. Python节点 → 对每条数据执行validate_record 3. 校验结果 - valid_records → 【写入Excel】→ 有效数据文件 -  - invalid_records → 【写入Excel】→ 无效数据文件附错误原因 4. 【IF】无效数据数量 0: 【日志输出】→ f本次采集有 {invalid_count} 条数据格式异常 【发送邮件】→ 通知相关负责人人工复核把无效数据单独保存一份带错误原因的Excel方便回溯和修复。总结数据校验是采集后写入前的防线。格式校验用正则业务逻辑校验加规则真实性校验按需上。校验不过的数据不要直接丢弃单独存一份带错误原因的日志方便后续排查。作者林焱
影刀RPA 常见数据格式校验:身份证、手机号、邮箱、URL的验证套路
发布时间:2026/7/15 9:10:49
影刀RPA 常见数据格式校验身份证、手机号、邮箱、URL的验证套路数据采集完了不等于数据就是对的。用户填的表单数据、网页上采集的信息、API返回的字段——这些数据里混着大量格式错误的内容。如果不校验就写入数据库或发给下游系统后果可能是整批数据被拒收。这篇文章给出四种最常见的数据格式校验方案附带正则表达式模板拿来就能用。校验的目的分层不是所有校验都要做到100%准确。先想清楚你的场景第一层格式校验。手机号是不是11位数字、邮箱里有没有符号。这一层只管长得像不像不管是不是真的。适合数据清洗的第一步——先把明显不对的过滤掉。第二层业务逻辑校验。日期不能是未来的、金额不能是负数、订单号必须符合公司编码规则。这一层是在格式正确的基础上检查数据是否合理。第三层真实性校验。手机号能不能打通、邮箱是否存在、身份证号码的校验位对不对。这一层需要外部系统配合最高成本也最高。拼多多店群自动化上架方案大部分RPA场景做到第一层第二层就够了。第三层除非业务强需求否则投入产出比不高。手机号校验importredefvalidate_phone(phone):校验中国大陆手机号格式ifnotphone:returnFalse,手机号为空phonestr(phone).strip()# 去掉可能存在的86前缀ifphone.startswith(86):phonephone[3:]# 1开头第二位3-9总共11位patternr^1[3-9]\d{9}$ifre.match(pattern,phone):returnTrue,phoneelse:returnFalse,f手机号格式不正确:{phone}注意号段在不断更新比如广电的192号段上面这个正则用[3-9]覆盖了目前所有号段。身份证号校验身份证校验分两步格式校验 校验位计算。importrefromdatetimeimportdatetimedefvalidate_id_card(id_number):校验中国大陆18位身份证号ifnotid_number:returnFalse,身份证号为空id_strstr(id_number).strip().upper()# 1. 格式17位数字 1位数字或Xifnotre.match(r^\d{17}[\dX]$,id_str):returnFalse,格式不正确需18位# 2. 出生日期校验try:birthdatetime.strptime(id_str[6:14],%Y%m%d)ifbirth.year1900orbirthdatetime.now():returnFalse,出生日期不合理except:returnFalse,出生日期无效# 3. 校验位计算weights[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]check_chars10X98765432totalsum(int(id_str[i])*weights[i]foriinrange(17))expected_checkcheck_chars[total%11]ifid_str[-1]!expected_check:returnFalse,f校验位不正确期望{expected_check}# 4. 提取信息info{地区码:id_str[:6],出生日期:birth.strftime(%Y-%m-%d),性别:男ifint(id_str[16])%21else女,}returnTrue,info第17位索引16奇数为男性偶数为女性。邮箱校验importredefvalidate_email(email):校验邮箱格式ifnotemail:returnFalse,邮箱为空emailstr(email).strip()# 基本格式校验patternr^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$ifnotre.match(pattern,email):returnFalse,邮箱格式不正确# 额外检查if..inemail:returnFalse,邮箱包含连续的点ifemail.count()!1:returnFalse,邮箱符号数量不正确returnTrue,email注意这个正则覆盖了99%的合法邮箱格式。但RFC 5322定义的合法邮箱格式远比这个复杂比如可以用引号包裹、支持特殊字符。对于RPA场景上述正则够用了——你采集回来的数据里很少出现那种极端格式的邮箱。URL校验importrefromurllib.parseimporturlparsedefvalidate_url(url):校验URL格式ifnoturl:returnFalse,URL为空urlstr(url).strip()# 补全协议如果没有的话ifnoturl.startswith((http://,https://)):urlhttps://url[video(video-hqtqq1SJ-1784060314069)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营)]try:resulturlparse(url)# 必须有scheme和netlocifall([result.scheme,result.netloc]):# netloc必须有至少一个点域名if.inresult.netloc:returnTrue,urlreturnFalse,URL格式不完整except:returnFalse,URL解析失败把校验串成数据清洗流程# 完整的数据记录校验 defvalidate_record(record,rules): record: 字典 {phone: 13800138000, email: testexample.com, ...} rules: 字典 {phone: validate_phone, email: validate_email, ...} 返回: (is_valid, errors) errors[]forfield,validatorinrules.items():valuerecord.get(field)valid,resultvalidator(value)ifnotvalid:errors.append({field:field,value:value,error:result})returnlen(errors)0,errors# 使用示例rules{phone:validate_phone,email:validate_email,id_card:validate_id_card,}data[{phone:13800138000,email:zhangexample.com,id_card:110101199001011234},{phone:12345,email:bad-email,id_card:123456789012345678},]valid_records[]invalid_records[]forrecordindata:is_valid,errorsvalidate_record(record,rules)ifis_valid:valid_records.append(record)else:record[_errors]errors invalid_records.append(record)print(f有效数据{len(valid_records)}条)print(f无效数据{len(invalid_records)}条)forrininvalid_records:print(f 原始数据{r})foreinr[_errors]:print(f{e[field]}:{e[error]})在影刀流程中集成采集流程中的校验步骤 1. 【读取Excel】→ 读取采集到的数据 2. Python节点 → 对每条数据执行validate_record 3. 校验结果 - valid_records → 【写入Excel】→ 有效数据文件 -  - invalid_records → 【写入Excel】→ 无效数据文件附错误原因 4. 【IF】无效数据数量 0: 【日志输出】→ f本次采集有 {invalid_count} 条数据格式异常 【发送邮件】→ 通知相关负责人人工复核把无效数据单独保存一份带错误原因的Excel方便回溯和修复。总结数据校验是采集后写入前的防线。格式校验用正则业务逻辑校验加规则真实性校验按需上。校验不过的数据不要直接丢弃单独存一份带错误原因的日志方便后续排查。作者林焱