python 写一个判断文本中是否有手机号的函数,并提取出文本中的手机号

我们需要判断文本中是否有手机号,并提取出手机号。 中国大陆的手机号规则: 1. 通常为11位数字。 2. 目前手机号段分配如下: - 移动号段:134(0-8)、135、136、137、138、139、147、148、150、151、152、157、158、159、172、178、182、183、184、187、188、195、198 - 联通号段:130、131、132、145、146、155、156、166、175、176、185、186 - 电信号段:133、149、153、173、177、180、181、189、190、191、193、199 - 虚拟运营商:170、171 3. 但是,我们通常只需要考虑前三位(或者前两位)来判断是否属于手机号段,另外还有一些号段是14x、16x、17x、18x、19x等。 注意:手机号可能出现在文本中的任何位置,可能与其他数字混合,所以我们需要用正则表达式来匹配。 考虑到手机号可能出现的情况: 1. 手机号可能是连续11位数字,但前后可能有其他字符(非数字),例如在文本中单独出现,或者被空格、标点等隔开。 2. 手机号中间不应该出现空格、连字符等(因为题目要求的是手机号,一般我们认为是连续11位数字),但有时用户可能会用分隔符,比如写成“135-1234-5678”或“135 1234 5678”。不过,按照标准,我们通常认为连续11位数字,或者有时会加上分隔符,但题目没有明确说明,所以这里我们按照连续11位数字来匹配,如果用户使用了分隔符,那么可能就不匹配了。

所以,我们分两步: 1. 用正则表达式匹配所有连续的11位数字,并且要求是以1开头的。 2. 检查每个匹配到的11位数字的前三位是否在有效的前三位集合中。 这样,我们就能准确地提取手机号。 另外,为了避免匹配到其他长数字中的11位(比如身份证号中可能包含11位连续数字),我们可以在匹配时加上边界限制(使用\b表示单词边界)。 但是,手机号在文本中可能出现的位置,前后可能不是空格,可能是标点,所以我们也可以使用非数字边界:即匹配前后不是数字的位置。我们可以用负向零宽断言,但这样写正则表达式会复杂。我们可以在匹配后,检查匹配到的字符串前后字符是否为非数字(或者开头和结尾),但正则表达式本身可以用\b来匹配单词边界,因为数字和汉字、字母、标点之间都有边界。 因此,正则表达式可以写为:r'\b1\d{10}\b',但是这样会匹配所有1开头的11位数字,然后我们再过滤前三位。 但是,注意:如果手机号在文本中紧跟着一个英文单词,那么\b可能不起作用,因为\b是单词边界,而数字和字母之间被认为是边界。所以,我们也可以使用:r'(?<!\d)1\d{10}(?!\d)',这表示前后不能是数字。这样更好。 所以,我们使用正则表达式:`r'(?<!\d)(1\d{10})(?!\d)'` 来匹配前后不是数字的1开头的11位数字。 步骤: 1. 导入re模块 2. 定义有效的前三位集合(见上面) 3. 使用re.findall找到所有匹配的字符串 4. 遍历匹配到的字符串列表,检查前三位是否在有效集合中,如果在,则加入结果列表。 注意:有可能同一个手机号在文本中出现多次,我们都要提取出来。 函数设计: 输入:文本字符串 输出:返回两个值:一个布尔值(表示是否有手机号),一个列表(包含所有提取到的手机号) 或者,我们可以直接返回提取到的手机号列表,然后通过判断列表是否为空来确定是否有手机号。但是题目要求判断是否有,并提取,所以我们可以返回一个元组:(has_phone, phone_list) 但是,也可以直接返回列表,然后由调用者判断列表是否为空。这里按照要求,返回两个值

import redef find_mobile_numbers(text):"""判断文本中是否有手机号,并提取所有手机号。参数:text (str): 待检查的文本返回:tuple: (是否存在手机号, 手机号列表)"""# 中国手机号正则表达式(匹配11位数字,以常见号段开头)pattern = r'(?<!\d)(1(?:3[0-9]|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8})(?!\d)'# 查找所有匹配的手机号mobile_numbers = re.findall(pattern, text)# 返回结果(布尔值和手机号列表)return (bool(mobile_numbers), mobile_numbers)# 测试示例
if __name__ == "__main__":test_text = """我的联系方式是:13800138000,备用号码是18912345678。无效号码:12345678901(首位错误)、1380013800(10位)、客服电话:10086,座机:0755-12345678。新号码:17612345678,虚拟运营商:17012345678"""has_mobile, numbers = find_mobile_numbers(test_text)print("是否存在手机号:", has_mobile)print("提取到的手机号:", numbers)

函数说明:

  1. 正则表达式解析

    • (?<!\d):确保前面不是数字(防止匹配更长数字中的部分)

    • (1...):手机号以1开头

    • (?:3[0-9]|...):匹配第二位和第三位(常见号段)

    • \d{8}:匹配剩余8位数字

    • (?!\d):确保后面不是数字(防止匹配更长数字中的部分

  2. 运行结果:

    是否存在手机号: True
    提取到的手机号: ['13800138000', '18912345678', '17612345678', '17012345678']

    进程已结束,退出代码为 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87029.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

作物生长模型Oryza V3实战12:drate程序详解

drate(v2).exe,可以通过观察移植日、穗部分化、开花和成熟的物候日期(即日和年),DRATE(v2)用于校准四个阶段的发展速率:幼苗期(DVRJ,oCday-1)、光周期敏感期(DVRI,oCday-1)、穗部发育期(DVRP,oCday-1)和生殖期(DVRR,oCday-1)。 一 准备输入文件 1、准备.crp,.…

利用视觉-语言模型搭建机器人灵巧操作的支架

25年6月来自斯坦福和德国卡尔斯鲁厄理工的论文“Scaffolding Dexterous Manipulation with Vision-Language Models”。 灵巧机械手对于执行复杂的操作任务至关重要&#xff0c;但由于演示收集和高维控制的挑战&#xff0c;其训练仍然困难重重。虽然强化学习 (RL) 可以通过在模…

面试拷打-20250701

memcopy和memmov 详细解释 示例1&#xff1a;不重叠的内存区域 正常复制。 示例2&#xff1a;重叠的内存区域 原始数据&#xff1a;src2是一个包含字符串"HelloWorld"的字符数组。使用memcpy&#xff1a; memcpy(src2 2, src2, 5);试图将src2中的前5个字符复制…

什么是 BigKey?

Redis BigKey 深度解析&#xff1a;识别、危害与优化方案 什么是 BigKey&#xff1f; 在 Redis 中&#xff0c;BigKey 是指存储大量数据的单个键&#xff0c;这些键通常具有异常大的内存占用或包含大量元素。BigKey 不是由数据类型定义&#xff0c;而是由其资源消耗决定的。 …

量化选股策略 聚宽

# 量化选股策略完整分析与优化建议 ## 策略整体架构分析 这个量化交易策略主要由以下几个核心部分组成&#xff1a; 1. **初始化设置**&#xff1a;配置基准指数、交易参数和全局变量 2. **选股逻辑**&#xff1a;通过财务指标筛选优质股票 3. **股票过滤**&#xff1a;排除…

Python 数据分析:numpy,抽提,布尔索引2。

目录 1 示例代码2 欢迎纠错3 论文写作/Python 学习智能体------以下关于 Markdown 编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右S…

解决leetcode第3597题分割字符串

3597. 分割字符串 难度&#xff1a;中等 问题描述&#xff1a; 给你一个字符串 s&#xff0c;按照以下步骤将其分割为 互不相同的段 &#xff1a; 从下标 0 开始构建一个段。 逐字符扩展当前段&#xff0c;直到该段之前未曾出现过。 只要当前段是唯一的&#xff0c;就将其…

电源芯片之DCDC初探索ING

1. 概述 DC-DC转换器的意思是直流变直流&#xff08;不同的直流电源值得转换&#xff09;&#xff0c;是一种在直流电路中将一个电压值的电能变为另一个电压值的电能装置。 DC-DC转换器一般由控制芯片、电感线圈、二极管、三极管、电容器构成。 2. 基本拓扑结构 2.1 非隔离…

JavaEE:分布式session

一、使用Redis存储分布式session&#xff1a; 1.SpringBoot整合Redis&#xff0c;见如下地址&#xff1a; JavaEE&#xff1a;SpringBoot整合Redis_a526001650a-CSDN博客 2.代码实现分布式session存储(此处以token为例)&#xff1a; Autowired private RedisTemplate<St…

OpenCV CUDA模块设备层-----“大于阈值设为零” 的图像处理函数 thresh_to_zero_inv_func()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模块&#xff08;cudev&#xff09; 中的一个仿函数生成器&#xff0c;用于创建一个 “大于阈值设为零” 的图像处理函数对象。 …

FastGPT与MCP:解锁AI新时代的技术密码

一、AI 浪潮中的新星&#xff1a;FastGPT 与 MCP 登场 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动各行业变革的核心力量。从智能语音助手到复杂的图像识别系统&#xff0c;AI 的应用无处不在&#xff0c;而其中的关键技术 —— 语言模…

browser-tools-mcp + excel-mcp-server + cursor 实现读取网页信息自动写入Excel

browser-tools-mcp excel-mcp-server cursor 实现读取网页信息自动写入Excel 文章目录 browser-tools-mcp excel-mcp-server cursor 实现读取网页信息自动写入Excel一、安装node.js和npm1、安装nvm2、安装最新版本的node.js 二、安装browser-tools-mcp1、安装 BrowserTools…

Linux安装JDK和Maven

Linux安装JDK和Maven 安装JDK1.8 oracle官网 https://www.oracle.com 下载包地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ 步骤1&#xff1a;官网下载压缩包 点击想要下载的版本&#xff0c;需要登录Oracle的账号&#xff0c;没有的话需要…

MySQL主从复制与数据库集群深度解析

一、主从复制核心架构与复制模式 MySQL主从复制是构建分布式数据库的基础技术&#xff0c;通过日志同步机制实现数据冗余与读写分离。其核心架构分为三层&#xff1a; 日志记录层&#xff1a;主库将数据变更写入二进制日志&#xff08;Binlog&#xff09;网络传输层&#xff…

安装emsdk 4.0.10报Connection reset by peer解决

出错如下: 使用浏览器下载所需文件 https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/node-v22.16.0-darwin-x64.tar.gz 移动到到emsdk/downloads下 修改emsdk.py download_even_if_exists=True 设置环境变量

win11,visual studio 2022,配置dcmtk,opencv

一、配置dcmtk 1 文件下载---地址&#xff0c;Software Development based on DCMTK - dicom.offis.de 源文件下载&#xff0c;选择.zip下载&#xff0c;.tar.gz为Linux和macOS下面常见的压缩包 支持库下载 解决 DCMTK 在 Windows 上编译时所需的依赖库问题 libiconv GNU有…

2025 最新 Appium Inspector 环境搭建教程

1 环境搭建背景 版本升级&#xff1a;Appium 2.0 版本替代 1.x&#xff0c;原 Appium Desktop 因安全漏洞和功能废弃不再适用。需求痛点&#xff1a;Android Studio 仅支持 debug 程序元素定位&#xff0c;需通过 Appium Inspector 实现通用 APK 元素定位。 2 环境搭建步骤 …

Vue 安装使用教程

一、Vue 简介 Vue&#xff08;读作 /vjuː/&#xff0c;类似于“view”&#xff09;是一款用于构建用户界面的渐进式 JavaScript 框架。它易于上手&#xff0c;轻量高效&#xff0c;适合快速构建前端界面&#xff0c;广泛应用于各类 Web 项目中。 二、Vue 安装方式 2.1 直接通…

通过http调用来访问neo4j时报错,curl -X POST 执行指令报错

curl -X POST ^ More? http://localhost:7474/db/neo4j/tx/commit ^ More? -H Authorization: Basic bmVvNGo6MTIzNDU2Nzg ^ More? -H Content-Type: application/json ^ More? -d { \"statements": [{\"statement": \"MATCH (n) RETURN n, label…

Node.js到底是什么

我想像是npm、vite这些名词大家都很熟悉&#xff0c;对它们的作用也有大致印象&#xff0c;但是可能都像我一样不明白Node.js到底是什么&#xff0c;这里给大家带来一个简单介绍。 Node.js 详解&#xff1a;历史发展、生态构建与底层原理 一、Node.js 的起源与历史发展 诞生背…