Python基础—15-正则表达式

前端之家收集整理的这篇文章主要介绍了Python基础—15-正则表达式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<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中文)、下划线等(就是字) \W:所有的非字字符(\w的取反) \s:所有的空白字符(\n、\t、\t、空格等) \S:所有的非空白字符 \b:词边界匹配(开头、结尾、标点、空格) \B:非词边界匹配
    • 次数控制

      *+次数,m表示出现的次数 {m,}:至少指定次数 {m,n}:指定范围内的次数,m到n次之间 {,n}:至多n次,相当于{0,n}

      <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'')<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不会再进行任何转义,只需在与正则语法相关的字符前加''即可让其使用原有意义

    猜你在找的Python相关文章