Python基础 21

正则表达式介绍

  它是一门独立的语言,跟Python等语言无关,但是其他语言可以使用它完成一些功能,主要用来选数据

  ^(13|14|15)[0-9]{9}$ 正则表达式

  正则表达式:

    利用一些特殊符号匹配出想要的数据就是正则表达式

字符组

  [0123456789]  匹配0-9之间的数字

  [0-9] 匹配0-9之间的数据

  \d 匹配0-9之间的数据

  [a-z] 匹配a-z之间的字符

  [A-Z] 匹配A-Z之间字符

  匹配0-9a-zA-Z如何写  

    [0123456789ABCDEFGHIJ...abcdefghij...]
    [0-9A-Za-z]

字符 

  . 匹配除换行符以外的任意字符 # 掌握
  \w 匹配字母或数字或下划线 # 掌握
  \s 匹配任意的空白符
  \d 匹配数字 # 掌握
  \n 匹配一个换行符 # 掌握
  \t 匹配一个制表符
  \b 匹配一个单词的结尾
  ^ 匹配字符串的开始 # 掌握
  $ 匹配字符串的结尾 # 掌握
  \W 匹配非字母或数字或下划线
  \D 匹配非数字
  \S 匹配非空白符
  a|b 匹配字符a或字符b # 掌握
  () 匹配括号内的表达式,也表示一个组
  [...] 匹配字符组中的字符 # 掌握
  [^...] 匹配除了字符组中字符的所有字符 # 掌握

量词 

  1. 量词只能影响前面的一个字符
  2. 量词不能单独使用,必须配合其他字符串使用
  * 重复零次或更多次
  + 重复一次或更多次
  ? 重复零次或一次
  {n} 重复n次
  {n,} 重复n次或更多次
  {n,m} 重复n到m次

贪婪匹配和非贪婪匹配

   待匹配的字符

  <script>123</script>

  正则表达式是:
    <.*>

   匹配结果是:
    <script>123</script>

  默认匹配的是贪婪匹配:尽可能的多匹配
  把贪婪匹配转为非贪婪匹配
    <.*?> 非贪婪匹配尽可能的少匹配

  .*?组合的用法

小练习

  ^[1-9]\d{13,16}[0-9x]$
  ^[1-9]\d{13,16}[0-9x]$
  ^[1-9]\d{14}(\d{2}[0-9x])?$
  ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$

  由于正则表达式的复杂性,所以,以后遇到常见的匹配规则,我们就去百度搜
  1. 写一个匹配常见的手机号的正则
    ^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\d{8}$

re模块

  1. re是内置的模块,可以直接使用
  2. 在python中,要想使用正则需要借助于re模块
    re: regular express

复制代码
import re

# re.findall('这是正则表达式', '待匹配的文件')

# res=re.findall('b', 'eva jason kavin')
# print(res)  # ['a', 'a', 'a']
# 如果匹配不到字符,就返回空列表[]

# res=re.search('b', 'eva jason kavin')
# print(res)
# print(res.group())

"""如果匹配不到,就返回None"""
# if res:
#     print(res.group())
# else:
#     print('没有匹配到')

# try:
#     print(res.group())
# except Exception:
#     print('没有找到')


res=re.match('a', 'aeva jason kavin')  # 从开头开始匹配
print(res)
print(res.group())
复制代码

分组

 

复制代码
# 分组相关

# res = re.search('^[1-9](\d{14})(\d{2}[0-9x]?)$','110105199812067023')
# print(res)
# print(res.group())
# print(res.group(1))
# print(res.group(2))

# 无名分组
# 对于findall,它具有分组优先展示, 也称之为是无名分组
# res = re.findall('^[1-9]\d{14}(?:\d{2}[0-9x]?)$','110105199812067023')
# print(res)  # ['023']


# 有名分组
res = re.search('^[1-9]\d{14}(?P<month>\d{2}[0-9x]?)$','110105199812067023')
print(res)
# print(res.group(1))
print(res.group())
print(res.group(1))
print(res.group('month'))
复制代码

正则实战案例

复制代码
import re
with open('hongniu','r',encoding='utf8')as f :
    res=f.read()
cdm=re.findall('<h2>(.*?)</h2>',res)

cdm1=re.findall("<p class='mapIco'>(.*?)</p>",res)

cdm2=re.findall("<p class='mailIco'>(.*?)</p>",res)

cdm3=re.findall("<p class='telIco'>(.*?)</p>",res)

cmd=zip(cdm,cdm1,cdm2,cdm3)
# print(list(cmd))
for item in list(cmd):
    print('''
    公司名称:%s
    公司地址:%s
    公司邮箱:%s
    公司电话:%s
    
    '''%(item[0],item[1],item[2],item[3]))
复制代码

 

  

posted @   Py玩家  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示