加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python基础—15-正则表达式

发布时间:2020-12-17 00:23:10 所属栏目:Python 来源:网络整理
导读:h1 id="正则表达式" data-source-line="1"正则表达式 h3 id="应用场景" data-source-line="3"应用场景 ul data-source-line="5" 特定规律字符串的查找替换切割等 邮箱格式、URL、IP等的校验 爬虫项目中,特定内容的提取 只要是能够使用字符串函数解决的问题

<h1 id="正则表达式" data-source-line="1">正则表达式
<h3 id="应用场景" data-source-line="3">应用场景
<ul data-source-line="5">

  • 特定规律字符串的查找替换切割等
  • 邮箱格式、URL、IP等的校验
  • 爬虫项目中,特定内容的提取
    • 只要是能够使用字符串函数解决的问题,就不要使用正则
    • 正则的效率较低,还会降低代码的可读性
    • 世界上最难理解的三样东西:医生的处方、道士的神符、码农的正则
    • 提醒:正则是用来写的,不是用来读的;在不知道功能的情况下,不要试图阅读别人的正则。

      说明:正则的解析处理是由re模块完成

    • 相关函数:

      • match:从开头进行匹配,匹配到就返回正则结果对象,没有就返回None
      • search:从任意位置匹配,匹配到一次就返回,没有就返回None
      <span style="color: #008000">#<span style="color: #008000"> 只从开头匹配,找到返回一个正则结果对象,没有找到返回None<span style="color: #008000">

      <span style="color: #008000"> m = re.match('abc','abcsdhasdasjabcweuqo')<span style="color: #008000">

      <span style="color: #008000"> 全部匹配,只要找到就停止并返回

      m = re.search(<span style="color: #800000">'<span style="color: #800000">abc<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">sdhabcsdasjabcweuqo<span style="color: #800000">'<span style="color: #000000">)

      <span style="color: #0000ff">if<span style="color: #000000"> m:
      <span style="color: #008000">#<span style="color: #008000"> 提取匹配到的内容
      <span style="color: #0000ff">print<span style="color: #000000">(m.group())
      <span style="color: #008000">#<span style="color: #008000"> 获取匹配位置
      <span style="color: #0000ff">print(m.span())

      • findall:全局匹配,返回匹配到的结果列表,没有时返回空列表
      f = re.findall(,(type(f))
      • compile:生成正则表达式对象
      c = re.compile(<span style="color: #008000">#<span style="color: #008000"> 从开头进行匹配<span style="color: #008000">

      <span style="color: #008000"> m = c.match('hellosdsjldkabc')<span style="color: #008000">

      <span style="color: #008000"> 从任意位置匹配

      m = c.search(<span style="color: #800000">'<span style="color: #800000">shdjkhelloaskjdha<span style="color: #800000">'<span style="color: #000000">)
      <span style="color: #0000ff">if<span style="color: #000000"> m:
      <span style="color: #0000ff">print<span style="color: #000000">(m.group())
      <span style="color: #008000">#<span style="color: #008000"> 匹配所有
      f = c.findall(<span style="color: #800000">'<span style="color: #800000">helloasjdhakhello<span style="color: #800000">'<span style="color: #000000">)
      <span style="color: #0000ff">if<span style="color: #000000"> f:
      <span style="color: #0000ff">print(f)

      将正则的匹配分两步完成:先创建正则对象,然后通过对象的match、search、findall方法完成匹配

      单个字符:

      -z]:a~-9]:0~-Z0-9^-9^0-9
    • 次数控制

      *+

      <pre data-source-line="94"><code class="hljs"><span class="xml">?

      正则的匹配默认都是贪婪的(最大限度的匹配)

    • 边界限定

      • ^:以指定的内容开头
      • $:以指定的内容结尾
      • 示例
      <span style="color: #008000">#<span style="color: #008000"> 以指定的内容开头<span style="color: #008000">

      <span style="color: #008000"> c = re.compile(r'^abc')<span style="color: #008000">

      <span style="color: #008000"> 以指定的内容结尾

      c = re.compile(r<span style="color: #800000">'<span style="color: #800000">kas$<span style="color: #800000">'<span style="color: #000000">)

      s = c.search(<span style="color: #800000">'<span style="color: #800000">abcsdhkas<span style="color: #800000">'<span style="color: #000000">)

      <span style="color: #0000ff">if<span style="color: #000000"> s:
      <span style="color: #0000ff">print(s.group())

    • 优先级控制

      • |:表示或,它拥有最低的优先级
      • ():用于表示一个整体,明确的指定优先级
      • 示例:
      c = re.compile(r<span style="color: #800000">'<span style="color: #800000">a(hello|world)b<span style="color: #800000">'<span style="color: #000000">)

      s = c.search(<span style="color: #800000">'<span style="color: #800000">aworldb<span style="color: #800000">'<span style="color: #000000">)

      <span style="color: #0000ff">if<span style="color: #000000"> s:
      <span style="color: #0000ff">print(s.group())

    • 分组匹配

      • 说明:()不但可以作为一个整体,还可以进行分组匹配
      • 示例1:
      c = re.compile(r<span style="color: #800000">'<span style="color: #800000">(d+)([a-z]+)(d+)<span style="color: #800000">'<span style="color: #000000">)

      s = c.search(<span style="color: #800000">'<span style="color: #800000">shd327sjahdajhsd87892ehawksd<span style="color: #800000">'<span style="color: #000000">)

      <span style="color: #0000ff">if<span style="color: #000000"> s:
      <span style="color: #0000ff">print<span style="color: #000000">(s.group())
      <span style="color: #008000">#<span style="color: #008000"> 默认就是全部的匹配内容,等价于上式
      <span style="color: #0000ff">print<span style="color: #000000">(s.group(0))
      <span style="color: #008000">#<span style="color: #008000"> 第一个()匹配到的内容
      <span style="color: #0000ff">print(s.group(1<span style="color: #000000">))
      <span style="color: #0000ff">print(s.group(2<span style="color: #000000">))
      <span style="color: #0000ff">print(s.group(3<span style="color: #000000">))
      <span style="color: #0000ff">print<span style="color: #000000">(s.span())
      <span style="color: #0000ff">print<span style="color: #000000">(s.span(0))
      <span style="color: #0000ff">print(s.span(1<span style="color: #000000">))
      <span style="color: #0000ff">print(s.span(2<span style="color: #000000">))
      <span style="color: #0000ff">print(s.span(3))

      • 示例2:给分组起名字
      <span style="color: #008000">#<span style="color: #008000"> 固定匹配<span style="color: #008000">

      <span style="color: #008000"> c = re.compile(r'
      w+
      ')<span style="color: #008000">

      <span style="color: #008000"> 1表示前面第一个小括号匹配的内容<span style="color: #008000">

      <span style="color: #008000"> c = re.compile(r'<([a-z]+)><([a-z]+)>w+</2></1>')<span style="color: #008000">

      <span style="color: #008000"> 给()起名字

      c = re.compile(r<span style="color: #800000">'<span style="color: #800000"><(?P[a-z]+)><(?P[a-z]+)>w+</(?P=ergou)></(?P=goudan)><span style="color: #800000">'<span style="color: #000000">)

      s = c.search(<span style="color: #800000">'<span style="color: #800000">

      百度一下
      <span style="color: #800000">'<span style="color: #000000">)

      <span style="color: #0000ff">if<span style="color: #000000"> s:
      <span style="color: #0000ff">print(s.group())

    • 贪婪匹配

      • 贪婪:最大限度的匹配叫贪婪。正则的匹配默认是贪婪。
      • 非贪婪:只要满足匹配条件,能少匹配就少匹配;通过可以使用'?'进行取消贪婪
      • 示例:
      <span style="color: #008000">#<span style="color: #008000"> 取消任意多次的贪婪<span style="color: #008000">

      <span style="color: #008000"> c = re.compile(r'a.*?b')<span style="color: #008000">

      <span style="color: #008000"> 取消至少一次的贪婪

      c = re.compile(r<span style="color: #800000">'<span style="color: #800000">a.+?b<span style="color: #800000">'<span style="color: #000000">)

      s = c.search(<span style="color: #800000">'<span style="color: #800000">abdhsadjbsdjabs<span style="color: #800000">'<span style="color: #000000">)

      <span style="color: #0000ff">if<span style="color: #000000"> s:
      <span style="color: #0000ff">print(s.group())

    • 匹配模式

      • 说明:所谓模式就是对匹配的原则进行整体的修饰
      • 示例:
      <span style="color: #008000">#<span style="color: #008000"> 忽略大小写的匹配<span style="color: #008000">

      <span style="color: #008000"> c = re.compile(r'hello',re.I)<span style="color: #008000">

      <span style="color: #008000"> s = c.search('Hello world')

      <span style="color: #008000">#<span style="color: #008000"> 进行多行匹配,默认单行匹配<span style="color: #008000">

      <span style="color: #008000"> c = re.compile(r'^hello',re.M)<span style="color: #008000">

      <span style="color: #008000"> s = c.search('world nhello')

      <span style="color: #008000">#<span style="color: #008000"> 做为单行处理 或 让 . 能够匹配 n
      c = re.compile(r<span style="color: #800000">'<span style="color: #800000">

      .*?
      <span style="color: #800000">'<span style="color: #000000">,re.S)
      <span style="color: #008000">#<span style="color: #008000"> string = '
      hello
      '
      string = <span style="color: #800000">'''<span style="color: #800000">

      hello

      =<span style="color: #0000ff">if<span style="color: #000000"> s:
      <span style="color: #0000ff">print(s.group())

    • 字符转义

      • 若匹配正则语法中的特定字符都需要进行转义
      • 正则字符串会被处理两次,python中处理一次,re模块会在处理一次
      • 若不想考虑字符的转义问题,可以在书写正则字符串时前面加一个字符'r'
      • 添加'r'之后,在python不会再进行任何转义,只需在与正则语法相关的字符前加''即可让其使用原有意义

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读