本文目录导读:

在 Python 中隐藏手机号信息(脱敏处理)有多种方法,以下是几种常见的实现方式:
字符串切片替换法(最常用)
def hide_phone(phone):
"""保留前3位和后4位,中间用****隐藏"""
if len(phone) != 11:
return "手机号格式错误"
return phone[:3] + "****" + phone[7:]
# 示例
phone = "13812345678"
print(hide_phone(phone)) # 输出: 138****5678
正则表达式替换法
import re
def hide_phone_regex(phone):
"""使用正则表达式替换中间4位"""
pattern = r'(\d{3})\d{4}(\d{4})'
return re.sub(pattern, r'\1****\2', phone)
# 示例
phone = "13987654321"
print(hide_phone_regex(phone)) # 输出: 139****4321
可变隐藏位数法
def hide_phone_flexible(phone, start=3, end=4, hide_char='*'):
"""
可自定义隐藏位置和数量
:param phone: 手机号
:param start: 保留前几位
:param end: 保留后几位
:param hide_char: 隐藏字符
"""
if len(phone) != 11:
return "手机号格式错误"
hide_length = len(phone) - start - end
hidden_part = hide_char * hide_length
return phone[:start] + hidden_part + phone[-end:]
# 示例
print(hide_phone_flexible("13612345678")) # 136****5678
print(hide_phone_flexible("13612345678", 2, 3)) # 13*****678
批量处理列表中的手机号
def batch_hide_phones(phone_list):
"""批量隐藏手机号列表"""
hidden_list = []
for phone in phone_list:
hidden_list.append(hide_phone(phone))
return hidden_list
# 示例
phones = ["13811112222", "13933334444", "13755556666"]
hidden_phones = batch_hide_phones(phones)
print(hidden_phones) # 输出: ['138****2222', '139****4444', '137****6666']
使用 Pandas 处理 DataFrame 中的手机号
import pandas as pd
# 创建示例数据
data = {
'name': ['张三', '李四', '王五'],
'phone': ['13811112222', '13933334444', '13755556666']
}
df = pd.DataFrame(data)
# 方法1:使用 apply 函数
df['phone_hidden'] = df['phone'].apply(lambda x: x[:3] + '****' + x[7:])
# 方法2:使用字符串切片
df['phone_hidden2'] = df['phone'].str[:3] + '****' + df['phone'].str[7:]
print(df)
带格式验证的完整版本
import re
class PhoneHider:
"""手机号隐藏工具类"""
@staticmethod
def is_valid_phone(phone):
"""验证手机号格式"""
# 简单的11位数字验证
return bool(re.match(r'^1[3-9]\d{9}$', phone))
@staticmethod
def hide(phone, hide_char='*'):
"""
隐藏手机号中间4位
:param phone: 手机号字符串
:param hide_char: 隐藏字符,默认*
:return: 隐藏后的手机号或错误信息
"""
if not isinstance(phone, str):
return "输入类型错误"
phone = phone.strip() # 去除首尾空格
if not PhoneHider.is_valid_phone(phone):
return "手机号格式不正确"
return phone[:3] + hide_char * 4 + phone[7:]
@staticmethod
def batch_hide(phones):
"""批量隐藏"""
return [PhoneHider.hide(phone) for phone in phones]
# 使用示例
hider = PhoneHider()
# 单个隐藏
print(hider.hide("13812345678")) # 138****5678
print(hider.hide("12345")) # 手机号格式不正确
print(hider.hide(13812345678)) # 输入类型错误
# 批量隐藏
test_phones = ["13811112222", "13933334444", "13755556666", "12345"]
results = hider.batch_hide(test_phones)
print(results) # 输出: ['138****2222', '139****4444', '137****6666', '手机号格式不正确']
输出到文件或日志时的隐藏
import logging
def log_with_hidden_phone(data):
"""
在日志中隐藏手机号信息
"""
# 假设数据格式为: {"name": "张三", "phone": "13812345678"}
if isinstance(data, dict) and 'phone' in data:
masked_data = data.copy()
masked_data['phone'] = hide_phone(data['phone'])
return masked_data
return data
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
# 使用示例
user_data = {"name": "张三", "phone": "13812345678"}
logging.info(f"用户信息: {log_with_hidden_phone(user_data)}")
推荐使用方式
对于大多数场景,推荐使用最简单直接的字符串切片法:
def mask_phone(phone):
"""快速隐藏手机号"""
return phone[:3] + "****" + phone[7:] if len(phone) == 11 else phone
根据具体需求选择合适的方案:
- 简单场景:切片法或正则法
- 批量处理:使用列表推导式或 Pandas
- 需要验证:用完整版类方法
- 日志输出:使用专门的隐藏函数
这样可以有效保护用户隐私,同时保持数据可读性。