首页 > 其他分享 >数据解析正则re

数据解析正则re

时间:2024-03-17 23:29:50浏览次数:19  
标签:字符 匹配 res re 正则 print 解析 findall

正则re

1.为什么需要正则

需求

  判断一个字符串是否是手机号

解决

  编写一个函数,给函数一个字符串,如果是手机号则返回True,否则返回False

def isPhone(phone):
      # 长度为11
      # 全部都是数字字符
      # 以1开头
      pass

  if isPhone("15125324528"):
      print("是手机号")
  else:
      print("不是手机号")
  ```

使用正则匹配到数据,使用正则会很简单!

2、正则与re模块简介

导入正则

import re

**概述:** **正则表达式**,又称规则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern)

正则匹配是一个 模糊的匹配(不是精确匹配)

**re:**python自1.5版本开始增加了re模块,该模块提供了perl风格的正则表达式模式,re模块是python语言拥有了所有正则表达式的功能

- 如下四个方法经常使用

  - match()

  - search()

  - findall()

  - finditer()

2.正则基础及表达式

1. 匹配单个字符与数字

| 匹配           | 说明                                       |

| ------------ | ---------------------------------------- |

| .            | 匹配除换行符以外的任意字符,当flags被设置为re.S时,可以匹配包含换行符以内的所有字符 |

| []           | 里面是字符集合,匹配[]里任意一个字符      |

| [0123456789] | 匹配任意一个数字字符   |

| [0-9]        | 匹配任意一个数字字符     |

| [a-z]        | 匹配任意一个小写英文字母字符            |

| [A-Z]        | 匹配任意一个大写英文字母字符         |

| [A-Za-z]     | 匹配任意一个英文字母字符        |

| [A-Za-z0-9]  | 匹配任意一个数字或英文字母字符     |

| [^name]     | []里的^称为脱字符,表示非,匹配不在[]内的任意一个字符    |

| ^[lname]     | 以[]中内的某一个字符作为开头 |

| \d           | 匹配任意一个数字字符,相当于[0-9]  |

| \D           | 匹配任意一个非数字字符,相当于 [^0-9]  |

| \w           | 匹配字母、下划线、数字中的任意一个字符,相当于 [0-9A-Za-z_]   |

| \W           | 匹配非字母、下划线、数字中的任意一个字符,相当于 [^0-9A-Za-z_] |

| \s           | 匹配空白符(空格、换页、换行、回车、制表),相当于 [ \f\n\r\t]     |

| \S           | 匹配非空白符(空格、换页、换行、回车、制表),相当于 [^ \f\n\r\t]  |

2. 限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。

| 匹配     | 说明     |

| ------ | ----------------------------- |

| (xyz)  | 匹配括号内的xyz,作为一个整体去匹配  一个单元 子存储 |

| x?     | 匹配0个或者1个x,非贪婪匹配       |

| x*     | 匹配0个或任意多个x         |

| x+     | 匹配至少一个x           |

| x{n}   | 确定匹配n个x,n是非负数      |

| x{n,}  | 至少匹配n个x        |

| x{n,m} | 匹配至少n个最多m个x     |

| x\|y   | \|表示或的意思,匹配x或y       |

3. 匹配锚字符

锚字符:用来判定是否按照规定开始或者结尾

| 匹配   | 说明  |

| ---- | ----------------- |

| ^    | 行首匹配,和[]里的^不是一个意思 |

| $    | 行尾匹配              |

[a] # 匹配字母a
[ab] # 匹配字母a或b
[A-Z]  # 匹配任意一位大写字母
[0-9]  # 匹配任意一位数字
[a-zA-Z] # 匹配任意一位字母
[a][b]  # 匹配字母ab  等同于  ab
[a][bc] # 匹配字母ab或者ac
[a-z]{5}   # 匹配5个小写字母
[a-z]{2, 4}  # 匹配2-4位的小写字母
[a-z]{2,}   # 至少匹配2位小写字母

3.re模块中常用函数

通用flags(修正符)

| 值    | 说明   |

| ---- | ---------------- |

| re.I | 是匹配对大小写不敏感       |

| re.S | 使.匹配包括换行符在内的所有字符 |

通用函数

+ 获取匹配结果

  + 使用group()方法 获取到匹配的值

  + groups()    返回一个包含所有小组字符串的元组(也就是自存储的值),从 1 到 所含的小组号。


 

1.match()函数

原型

  def match(pattern, string, flags=0)

- 功能

  匹配成功返回 匹配的对象  

  匹配失败 返回 None

获取匹配结果

使用group()方法 获取到匹配的值

 groups()    返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

 注意:从第一位开始匹配  只匹配一次

参数

  | 参数      | 说明                 |

  | ------- | ------------------ |

  | pattern | 匹配的正则表达式(一种字符串的模式) |

  | string  | 要匹配的字符串            |

  | flags   | 标识位,用于控制正则表达式的匹配方式 |

代码
 

import re

res = re.match('\d{2}','123')

print(res.group())

  #给当前匹配到的结果起别名

 s = '3K4WSD567'

 x = re.match("(?P<value>\d+)",s)

 print(x.group(0))

 print(x.group('value'))

 2. searce()函数

功能

  扫描整个字符串string,并返回第一个pattern模式成功的匹配

  匹配失败 返回 None

 注意:

  只要字符串包含就可以

  只匹配一次

示例
 

 import re

  res = re.search('[a-z]', '131A3ab889s')

  print(res)

  print(res.group())

注意

  与search的区别

  相同点:

  都只匹配一次

  不同点:

  - search是在要匹配的字符串中  包含正则表达式的内容就可以

  - match 必须第一位就开始匹配  否则匹配失败

match 和 searce 这两个基本上很少用用的最多的也就是findall

3. findall()函数!!!(返回列表)

功能

  扫描整个字符串string,并返回所有匹配的pattern模式结果的字符串列表

示例

  myStr = """

  <a href="http://www.baidu.com">百度</a>

  <A href="http://www.taobao.com">淘宝</A>

  <a href="http://www.id97.com">电影网站</a>

  <i>我是倾斜1</i>

  <i>我是倾斜2</i>

  <em>我是倾斜2</em>

  html里是不区分大小写

  (1)给正则里面匹配的 加上圆括号 会将括号里面的内容进行 单独的返回

res = re.findall("(<a href=\"http://www\.(.*?)\.com\">(.*?)</a>)",myStr) #[('<a href="http://www.baidu.com">百度</a>', 'baidu', '百度')]

  # 括号的区别

res = re.findall("<a href=\"http://www\..*?\.com\">.*?</a>",myStr) #['<a href="http://www.baidu.com">百度</a>']

  (2) 不区分大小写的匹配 

res = re.findall("<a href=\"http://www\..*?\.com\">.*?</a>",myStr,re.I) #['<a href="http://www.baidu.com">百度</a>', '<A href="http://www.taobao.com">淘宝</A>']

res = re.findall("<[aA] href=\"http://www\..*?\.com\">.*?</[aA]>",myStr) #['<a href="http://www.baidu.com">百度</a>']

  (3) 使.支持换行匹配

res = re.findall("<a href="http://www..?.com">.?</a>",myStr,re.S) 

  (4) 支持换行 支持不区分大小写匹配 
 

res = re.findall("<a href="http://www..?.com">.?</a>",myStr,re.S|re.I) 
print(res)

这两个例子就用到了flags(修正符)

4. finditer()函数

功能

 与findall()类似,返回一个迭代器

省资源 用一个拿一个

代码

  import re

  res = re.finditer('\w', '12hsakda1')

  print(res)

  print(next(res))

  for i in res:

      print(i)

 5. split()函数

作用:切割字符串(前面python基础有)

 原型:

  def split(patter, string, maxsplit=0, flags=0)

参数

  pattern   正则表达式

  string      要拆分的字符串

  maxsplit   最大拆分次数  默认拆分全部

  flags          修正符

示例
 

import re

myStr = "asdas\rd&a\ts12d\n*a3sd@a_1sd"

#通过特殊字符 对其进行拆分 成列表

res = re.split("[^a-z]",myStr)

res = re.split("\W",myStr)

 6. 修正符

作用

  对正则进行修正

 使用

  search/match/findall/finditer 等函数 flags参数的使用

修正符

  re.I   不区分大小写匹配

  re.S    使.可以匹配换行符   匹配任意字符

使用

  re.I
 

print(re.findall('[a-z]','AaBb'))

print(re.findall('[a-z]','AaBb', flags=re.I))

  re.S
 

print(re.findall('<b>.*?</b>','<b>b标签</b>'))

print(re.findall('<b>.*?</b>','<b>b标\n签</b>', flags=re.S))

四、正则高级

1、分组&起名称

概念

  处理简单的判断是否匹配之外,正则表达式还有提取子串的功能,用()表示的就是要提取的分组

代码

  #给当前匹配到的结果起别名

  s = '3G4HFD567'

  re.match("(?P<value>\d+)",s)

  print(x.group(0))

  print(x.group('value'))

说明

 正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来

 group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串

2、编译

 概念

  当在python中使用正则表达式时,re模块会做两件事,一件是编译正则表达式,如果表达式的字符串本身不合法,会报错。另一件是用编译好的正则表达式提取匹配字符串

编译优点

  如果一个正则表达式要使用几千遍,每一次都会编译,出于效率的考虑进行正则表达式的编译,就不需要每次都编译了,节省了编译的时间,从而提升效率

compile()函数

作用

    将pattern模式编译成正则对象

  - 返回值

    编译好的正则对象

  - 示例

    import re

    re_phone = re.compile(r"(0\d{2,3}-\d{7,8})")

    print(re_phone, type(re_phone))

- 编译后其他方法的使用

  原型

  def match(self, string, pos=0, endpos=-1)

  def search(self, string, pos=0, endpos=-1)

  def findall(self, string, pos=0, endpos=-1)

  def finditer(self, string, pos=0, endpos=-1)

  参数

  | 参数     | 说明                |

  | ------ | ----------------- |

  | string | 待匹配的字符串           |

  | pos    | 从string字符串pos下标开始 |

  | endpos | 结束下标              |

  示例
 

s1 = "lucky's phone is 010-88888888"

s2 = "kaige's phone is 010-99999999"

ret1 = re_phone.search(s1)

print(ret1, ret1.group(1))

ret2 = re_phone.search(s2)

print(ret2, ret2.group(1))

3、贪婪与非贪婪

贪婪模式  

  贪婪概念:匹配尽可能多的字符

+  匹配换行符以外的字符至少一次

 *  匹配换行符以外的字符任意次

  实例
 

res = re.search('<b>.+</b>', '<b></b><b>b标签</b>')

res = re.search('<b>.*</b>', '<b>b标签</b><b>b标签</b><b>b标签</b><b>b标签</b>')

非贪婪模式

  非贪婪概念:尽可能少的匹配称为非贪婪匹配,*?、+?即可

.+?  匹配换行符以外的字符至少一次  拒绝贪婪

 .*?   匹配换行符以外的字符任意次      拒绝贪婪

  实例
 

res = re.search('<b>.+?</b>', '<b>b标签</b><b>b标签</b>')

res = re.search('<b>.*?</b>', '<b>b标签</b><b>b标签</b><b>b标签</b><b>b标签</b>')

标签:字符,匹配,res,re,正则,print,解析,findall
From: https://blog.csdn.net/tzy2358/article/details/136720559

相关文章

  • Redis缓存和MyBaits整合
    目录一.基础知识1.Redis缓存2.特点二.使用Redis1.下载redis2.安装RedisDesktopManager软件3.连接Redis三.Redis缓存和MyBaits整合1.加入依赖2.配置文件3.配置类4.创建数据库和实体类5.使用四.练习一.基础知识1.Redis缓存缓存(*Cache),就是数据交换的*缓......
  • VUE项目忽略ResizeObserver loop completed with undelivered notifications错误
    忽略"ResizeObserverlooplimitexceeded"和"ResizeObserverloopcompletedwithundeliverednotifications."两种错误。向vue.config.js中添加以下代码:module.exports=defineConfig({...devServer:{client:{overlay:{warnings:fa......
  • 可编辑表格中的两个列分别是用react-hook-form 和antd的inputNumber实现的,需要在开始
    可编辑表格中的两个列分别是用react-hook-form和antd的inputNumber实现的,需要在开始时间的列输入后失焦时,或者按enter键,鼠标聚焦到下一列,即结束时间,该如何设置在React项目中,要实现在一个可编辑表格中,当开始时间列输入后失焦或按下Enter键时,自动将焦点切换至结束时间列,你可以结合......
  • 「深入理解Java I/O:FilterInputStream」
      咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~前言  JavaI/O是Java编程语言的核心功能之一,提供了丰富的输入输出操作......
  • 中考英语首字母快速突破009-2021上海闵行英语二模-Preventing and Managing Stomach F
    PDF格式公众号回复关键字:ZKSZM009原文​Stomachfluisacommondisease.Itspreadseasily,whichmakesithardtoavoid.That'se(71)trueifsomeoneinyourfamilyhasit.Stomachfluiscausedbyavirus,butnotthesameonethatcausesregular......
  • 如何不中断连接保持linux服务器持续运行 —— screen 使用介绍
     请参考ck'sblog以获取最佳观感在linux服务器上跑模型的时候,有时会在终端会话中持续了一段时间后超时断开,或者因为意外情况断网,如果正常在命令行终端执行程序时,此时会中断程序的进行,这很恼火,这就意味着要让程序持续运行,就必须得保持主机和服务器的连接,程序跑一晚上,主机就......
  • linux上编译release并剥离调试信息
    使用objcopy:1转载出处:https://unpluggedcoder.me/2014/04/24/%E7%94%9F%E6%88%90%E5%8F%AF%E8%B0%83%E8%AF%95%E7%9A%84Release%E7%89%88%E6%9C%AC%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6--%E8%B0%83%E8%AF%95%E7%AC%A6%E5%8F%B7%E4%BF%A1%E6%81%AF%E6%8F%90%E5%8F%96......
  • go语言请求http接口示例 并解析json
    本例请求了天气api接口对接流程注册一个账号,对接免费实况天气接口阅读接口文档http://tianqiapi.com/index/doc?version=day请求接口解析json开发流程创建一个json.go文件需要引入的包import( "encoding/json" "fmt" "io/ioutil" "net/http")定义Wea......
  • 解决: java.util.concurrent.CancellationException详解
    解决:java.util.concurrent.CancellationException详解......
  • Java String类的compareTo() 方法
    compareTo()方法用于两种方式的比较:字符串与对象进行比较。按字典顺序比较两个字符串。intcompareTo(Objecto)或intcompareTo(StringanotherString)参数o--要比较的对象。anotherString--要比较的字符串。返回值返回值是整型,它是先比较对应字符的大小(ASC......