本文目录导读:

- Python 正则表达式(最常用)
- Python 处理复杂格式
- 命令行 Grep 方式
- JavaScript 提取
- PowerShell 脚本(Windows)
- 批量处理多个文件
- 增强版处理(支持更多格式)
- 使用建议
我来介绍几种提取手机号的脚本方法,根据不同需求选择适合的方案:
Python 正则表达式(最常用)
import re
def extract_phones(text):
# 匹配中国大陆手机号(1开头的11位数字)
pattern = r'1[3-9]\d{9}'
# 如果文本中有分隔符(如-、空格等)
# pattern = r'1[3-9][\s-]?\d{4}[\s-]?\d{4}'
phones = re.findall(pattern, text)
return phones
# 使用示例
text = """
联系人:张三 13812345678
李四:139-1234-5678
王五:138 1234 5678
固定电话:010-12345678
"""
phones = extract_phones(text)
print(phones) # ['13812345678', '13912345678', '13812345678']
Python 处理复杂格式
import re
def extract_phones_advanced(text):
# 更复杂的匹配,处理各种分隔符
pattern = r'(?<!\d)1[3-9]\d{9}(?!\d)|(?<!\d)1[3-9][-\s]?\d{4}[-\s]?\d{4}(?!\d)'
phones = set() # 使用set去重
for match in re.finditer(pattern, text):
phone = match.group()
# 清理格式
phone = re.sub(r'[-\s]', '', phone)
phones.add(phone)
return list(phones)
# 从文件读取
with open('contacts.txt', 'r', encoding='utf-8') as f:
content = f.read()
phones = extract_phones_advanced(content)
for phone in phones:
print(phone)
命令行 Grep 方式
# 使用grep提取手机号
grep -oE '1[3-9][0-9]{9}' 文件名.txt
# 处理带分隔符的
grep -oE '1[3-9][0-9-]{10,13}' 文件名.txt | sed 's/-//g'
# 递归搜索文件夹中所有txt文件
grep -roE '1[3-9][0-9]{9}' *.txt
JavaScript 提取
// 浏览器控制台或Node.js中使用
function extractPhones(text) {
// 匹配手机号(支持各种格式)
const pattern = /(?:\+?86)?1[3-9]\d{9}/g;
// 如果有分隔符
// const pattern = /1[3-9][\d\s-]{10,13}/g;
const phones = text.match(pattern) || [];
// 清理格式
return phones.map(phone => {
return phone.replace(/[\s-]/g, '');
});
}
// 从网页中提取
const text = document.body.innerText;
const phones = extractPhones(text);
console.log(phones);
PowerShell 脚本(Windows)
# 从文件提取手机号
$content = Get-Content "contacts.txt" -Raw
$pattern = '1[3-9]\d{9}'
$phones = [regex]::Matches($content, $pattern) | ForEach-Object { $_.Value }
$phones | Get-Unique | Set-Content "phones.txt"
批量处理多个文件
import os
import re
def batch_extract_phones(folder_path):
all_phones = set()
pattern = r'1[3-9]\d{9}'
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith(('.txt', '.csv', '.html')):
file_path = os.path.join(root, file)
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
phones = re.findall(pattern, content)
all_phones.update(phones)
except:
continue
# 保存到文件
with open('所有手机号.txt', 'w') as f:
for phone in all_phones:
f.write(phone + '\n')
return list(all_phones)
# 使用
phones = batch_extract_phones('文档目录/')
增强版处理(支持更多格式)
import re
def extract_all_phone_formats(text):
# 支持带国家码的
patterns = [
r'\+?86[-\s]?1[3-9]\d{9}', # +86或86开头
r'1[3-9]\d{9}', # 纯11位
r'1[3-9][-\s]?\d{4}[-\s]?\d{4}', # 带分隔符
r'\(?0\d{2,3}\)?[-\s]?\d{7,8}' # 固定电话
]
phones = {}
results = []
for pattern in patterns:
matches = re.findall(pattern, text)
for phone in matches:
# 标准化处理
cleaned = re.sub(r'[\s\(\)\-]', '', phone)
if cleaned.isdigit():
results.append(cleaned)
return list(set(results))
# 使用
text = "手机:+86 138-1234-5678,固话:0755-88886666"
phones = extract_all_phone_formats(text)
使用建议
- 小规模处理:直接用 Python 脚本或 grep 命令
- 大批量文件:使用 Python 批量处理脚本
- 网页数据:使用 JavaScript 或 Python + BeautifulSoup
- 数据清洗:提取后建议去重和格式统一
需要我详细说明某个具体场景的用法吗?