Python案例怎么隐藏手机号信息?

wen python案例 15

本文目录导读:

Python案例怎么隐藏手机号信息?

  1. 字符串切片替换法(最常用)
  2. 正则表达式替换法
  3. 可变隐藏位数法
  4. 批量处理列表中的手机号
  5. 使用 Pandas 处理 DataFrame 中的手机号
  6. 带格式验证的完整版本
  7. 输出到文件或日志时的隐藏
  8. 推荐使用方式

在 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
  • 需要验证:用完整版类方法
  • 日志输出:使用专门的隐藏函数

这样可以有效保护用户隐私,同时保持数据可读性。

抱歉,评论功能暂时关闭!