正则表达式re模块

本文介绍了如何从文本中提取手机号码,使用Python的正则表达式库`re`进行匹配和筛选。示例代码展示了两种不同的方法,一种通过简单的字符串处理,另一种利用正则表达式的模式匹配,有效地找出11位数字格式的手机号码。同时,文章还列举了正则表达式的常用功能,如匹配、分组、替换等,并提供了手机号码合法性验证的示例。
摘要由CSDN通过智能技术生成

请从以下文件里取出所有的手机号:
姓名 地区 身高 体重 电话
况咏蜜 北京 171 48 13651054608
王心颜 上海 169 46 13813234424
马纤羽 深圳 173 50 13744234523
乔亦菲 广州 172 52 15823423525
罗梦竹 北京 175 49 18623423421
刘诺涵 北京 170 48 18623423765
岳妮妮 深圳 177 54 18835324553
贺婉萱 深圳 174 52 18933434452
叶梓萱 上海 171 49 18042432324
杜姗姗 北京 167 49 13324523342

f = open("联系方式.txt",'r',encoding="gbk")
phones = []
for line in f:
    name,city,height,weight,phone = line.split()
    if phone.startswith('1') and len(phone) == 11:
        phones.append(phone)
print(phones)

更简单的如下:

import re
phone_list = re.findall("[0-9]{11}",f.read())
print(phone_list)
re.match 从头开始匹配
re.search 匹配包含 , 有一个就返回
re.findall 把所有匹配到的字符放到以列表中的元素返回
# '.'默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
# print(re.search(".","alex"))
# print(re.search(".","alex").group())
# print(re.search(".","\n"))

# '^'配字符开头,'$'匹配字符结尾
# print(re.search("^alex","alexli"))
# print(re.search("^alex","alexli").group())
# print(re.search("^alex$","alexli"))

# '*'匹配*号前的字符0次或多次
# print(re.search("a*","ddddd"))
# print(re.search("a*","addddd"))
# print(re.search("a*","aaaaddddd"))

# '+'匹配前一个字符1次或多次
# print(re.search("a+","aaaaaddsaaadd"))
# print(re.search("a+","ddsaaadd"))
# print(re.search("a+","dddd"))

# '?'匹配前一个字符1次或0次
# print(re.search("a?","aaadddd"))
# print(re.search("a?","dddd"))

# '{m}'匹配前一个字符m次
# print(re.search("a{3}","aaddddd"))
# print(re.search("a{3}","aaaddddd"))

# '{n,m}' 匹配前一个字符n到m次
# print(re.search("a{3,5}","aaadddddd"))
# print(re.search("a{3,5}","aaaaaaddadddd"))
# print(re.findall("ab{1,3}","abbabcabbcbbb"))
# '|' 匹配|左或|右的字符
# print(re.search("abc|ABC","ABCBabcCD"))
# print(re.search("absc|ABsC","ABCBabcCD"))

# '(...)' 分组匹配
# print(re.search("(abc){2}a(123|45)", "abcabca456c").group())
# print(re.search("(abc){2}a(123|45)", "abcabca123c"))
# print(re.search("(abc){2}a(123|45)", "abc-abca123c"))

# '\A'只从字符开头匹配
# print(re.search("\Aabc","alexabc"))
# print(re.search("\Aabc","abcalexabc"))

# '\Z'    匹配字符结尾,同$
# print(re.search("\Aabc\Z","abc"))

# []
# print(re.search("[a-z]","jack"))
# print(re.search("[a-zA-Z0-9]{3}","jack"))

# \d'匹配数字0-9
# print(re.search("\d","sfdhohfow1454"))
# print(re.search("\d{3}","sfdhohfow1454"))
# print(re.search("\d+","sfdhohfow1454"))
# '\D' 匹配非数字
# print(re.search("\D+","sfdhohfow1454"))
# print(re.findall("\D+","sfdh2s23dfoh5fow1454"))
# print(re.findall("\d+","sfdh2s23dfoh5fow1454"))

# '\w'匹配[A-Za-z0-9],'\W'匹配非[A-Za-z0-9]
# print(re.findall("\w+","sfwetfwsdfs56416"))
# print(re.findall("\W+","sfwetfwsdfs56416"))
# print(re.findall("\W+","sfwetfws=dfs56416"))

# 's'     匹配空白字符、\t、\n、\r ,
# print(re.findall("\s","asdfsa\ndfsl\rjfdsld\t"))

# '(?P...)' 分组匹配
# id_num = "371481199306143631"
# print(re.search("([0-9]{3})([0-9]{3})([0-9]{4})", id_num))
# print(re.search("([0-9]{3})([0-9]{3})([0-9]{4})", id_num).groups())
# print(re.search("(?P<province>[0-9]{3})(?P<city>[0-9]{3})(?P<birthday>[0-9]{4})", id_num).groups())
# print(re.search("(?P<province>[0-9]{3})(?P<city>[0-9]{3})(?P<birthday>[0-9]{4})", id_num).groupdict())

# print(help(re))
# re.split 以匹配到的字符当做列表分隔符
# print(re.split("[0-9]","sjfld3jlsdfs4lkjl5sljfdw22jljsl5"))
# print(re.split("[0-9]{2}","sjfld3jlsdfs4lkjl5sljfdw22jljsl5"))
# print(re.split("[a-z]","sjfld3jlsdfs4lkjl5sljfdw22jljsl5"))
# print(re.findall("[0-9]","sjfld3jlsdfs4lkjl5sljfdw22jljsl5"))
re.sub 匹配字符并替换
# print(re.sub("abc","ABC","abcdefg"))
# print(re.sub("abc","ABC","abcdefgabc",count=2))
# print(re.sub("abc","ABC","abcdefgabc")) # 默认全部替换
# print(re.sub("[a-z]","0","abcdefgabc")) # 默认全部替换
# print(re.sub("[a-z]","0","abcdeAfgabc")) # 默认全部替换
re.fullmatch 全部匹配 ,精确匹配
# print(re.fullmatch("[a-z]","sahfwehnkbn"))
# print(re.fullmatch("a","sahfwehnkbn"))
# print(re.fullmatch("a","a"))
# print(re.fullmatch("aaaa","aaaa"))

# p = re.compile("[0-9]{11}")  # 先编译好
# print(p.search("1234512346542354312"))

# Flags标志符
# print(re.search("efg","alexEFG"))
# print(re.search("efg","alexEFG",re.I)) # I,忽略大小写

# re.M(MULTILINE): 多行模式,改变’^’和’$’的行为
# print(re.search("^alex","mack\nalexjackrain"))
# print(re.search("^alex","mack\nalexjackrain",re.M))
# print(re.search("^alex$","mack\nalex\njackrain",re.M))

# re.S(DOTALL): 改变’.’的行为,使其还能匹配到\n
# print(re.search(".","\n"))
# print(re.search(".","\n",re.S))

# re.split(pattern, string, maxsplit=0, flags=0) 用匹配到的值做为分割点,把值分割成列表
# s='9-2*5/3+7/3*99/4*2998+10*568/14'
# print(re.split("[-\+\*/]",s))

# import my_package
# from my_package import test

import re

# 验证手机号是否合法
phone_pat = re.compile('^(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8}$')
phone_pat = re.compile('^1[3-5]\d{9}$')

while True:
    phone = input('请输入您的手机号:')

    res = re.search(phone_pat, phone)
    if res:
        print('正常手机号')
    else:
        print('不是手机号')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值