嘘~ 正在从服务器偷取页面 . . .

正则表达式


re 模块


  • 正则表达式验证
    • 这个网址左边配置按钮里面可以将语言改为中文
  • 正则表达式练习网站
  • 练习网站很简单,输入正则表达式,匹配左边,但不能匹配到右边
    • 我是个菜鸡,写到第七就过不了了!

基本


  • re.match() : 从字符串开头进行匹配,如果字符串开头就不符合,返回 None
  • re.search() : 返回字符串中匹配的第一个结果,没有就返回 None
  • re.findall() : 返回字符串中所有符合的结果,没有就返回空列表[]

共同参数:


* **pattern : 正则表达式**
* **string : 匹配的字符串**
* **flags: 控制正则表达式匹配方式 ( <code>默认为0</code> )**
  • re.I : 让正则匹配不区分大小写
    • re.M : 让^和$支持多行匹配
    • re.S : 让 . 支持多行匹配
    • re.X 忽略表达式中的空白和注释,可以用#来写注释
    • 可以写为 re.M | re.S 来匹配多种规则

方法


  • group(number) : 返回匹配的字符串。

  • re.compile(): 生成一个正则表达式,可以直接.属性进行匹配

  • re.sub: 通过正则匹配字符串后替换字符串内容

    • sub(pattern, repl, string, count=0, flags=0):
    • pattern : 正则表达式
    • repl : 匹配后替换的内容 (可以是一个函数,函数需要返回处理后的文本)
    • string : 待匹配文本
    • count : 匹配次数
    • flags : 表达式匹配方式
    • re.subn(): 通过正则匹配字符串后替换字符串内容,返回一个元组

  • re.split : 通过匹配的正则表达式切割字符串

    • pattern, string, maxsplit=0, flags=0
    • pattern: 正则表达式
    • string: 待匹配文本
    • maxsplit: 最大切割次数
    • flags : 控制正则匹配方式

重点


正则通配符

  • ^: 匹配字符串开始位置 (需要写在正则前面)
  • $: 匹配字符串结束位置 (需要写在正则后面)
  • \d: 匹配数字 0-9
  • \X: 包含换行符在内的 unicode 字符
  • \w: 匹配 字母 数字 下划线
  • \s: 匹配空白字符
  • \b: 匹配边界
    • 边界可以这么理解:
      • 正则 :”ab\b”
      • 可以匹配到 cmab 中的 ab
      • 不能匹配到 cabd 中的 ab
  • tips: 记到这个就够了,只要记住小写是匹配什么,大写就是匹配相反的内容

  • .: 匹配任意内容(除了换行,可以通过标志位来开启匹配换行)
  • +: 跟在表达式后面,表示表达式必须匹配一次以上
  • *: 跟在表达式后面,表示表达式匹配任意次数
  • ?: 当?存在于+ *等贪婪通配符后面时,表示非贪婪模式(尽可能匹配少的内容)
    • . 默认是开启贪婪模式,匹配除了换行在内的所有内容
    • 字符串 : aaaaaa
    • 正则表达式 : a{2,6}( 贪婪模式 )会直接匹配到六个 a
    • 正则表达式 : a{2,6}?( 非贪婪模式 )会匹配到[‘aa’, ‘aa’, ‘aa’]
  • ?: 当?在除贪婪表达式外时,表示前面的内容可有可无
  • [..]: 匹配中括号内指定内容
  • [0-9A-Z]: 匹配数字,及大写英文
  • [^..]: 当^存在于中括号内时,表示匹配除了中括号内的所有其他内容
  • [^0-9a-z]: 匹配除了数字,及大写英文外的内容
  • a{3}: 匹配指定次数, 前面正则表达式只会匹配 aaa,不会匹配 aa。
  • a{5,}: 前面表示必须匹配五次 a 以上
  • | : 匹配 | 左边或者右边的正则
  • (): 记录匹配的内容,并分成一个组,可以配合\number 达到特殊效果
  • (?: ): 只匹配内容,不会在内存中记录分组信息。( 丢弃匹配 )
  • (?imx:A): 前面括号内的正则表达式会开启imx 匹配方式()
  • (?-imx:A): 前面括号内的正则表达式会关闭imx 匹配方式()
  • 当需要匹配正则表达式中通配符时候使用 \ 进行转义 \? 即可匹配问号

分组实例


分组实例

  • 现在有这个字符串 : <h1>我爱北京<h1> <h1>我爱北京<h2>
  • 通常在匹配网页或者成对出现的内容的时候使用
  • 我想匹配开头和结尾是一样的就可以这样写表达式
    • (<\w+>)我爱北京(\1)
    • \1 表示匹配前面\w+匹配到的内容,所以不会匹配到后面那个前后不一致的内容

分组实例

  • 通过 group 提取出指定正则表达式的内容
# 以下文本进行匹配
text = "123aaa"
# 通过(?P<ReName>正则)进行分组
# 前面的?P<name>:为固定写法,后面用group进行提取的时候,将名字传递进去
# 即可拿到后面正则表达式提取到的值
print(search(r'(?P<ReName>\d+)', text).group('ReName'))
# 输出为:123

断言实例 ( 预搜索 )


  • 以下内容都使用字符串
  • 字符串:我喜欢你,我喜欢猪头,我喜欢钱,我喜欢妹子,我喜欢黑丝
  • 当你想用正则定位一个内容,然后又不想用 group 进行取值的时候就也可以用断言,出来的结果就是你想要的内容

正向先行断言 (?=正则)

  • (?=正则): 直接讲不容易懂,直接上实例
    • 我需要匹配我喜欢,并且喜欢的后面必须是黑丝
    • 正则表达式 : 我喜欢(?=黑丝)
    • 上面中正则表达式指定我喜欢后面必须是跟着黑丝
    • 注意这里黑丝并没有被消耗,如果表达式改成 我喜欢(?=黑丝).{2}
    • 那么就会匹配到我喜欢黑丝
    • 其实我不喜欢

反向先行断言 (?!正则)

  • 反向先行断言和正向先行断言完全相反
    • 正则表达式 : 我喜欢(?!黑丝)
    • 匹配所有我喜欢后面不是跟着黑丝的内容
    • 同理,不会消耗文本,(预搜索)
    • 也就是说,上面这个正则,在不匹配的时候,就算作成功(理解为 Python 中的取反)

正向后行断言(?<=正则)

  • 表示字符串之前的内容必须匹配正则
    • 正则表达式 : (?<=我喜欢).
    • 上面正则表达式会匹配到我喜欢后面的一个内容

反向后行断言(?<!正则)

  • 这个就很好理解了
    • 正则表达式 : (?<!我喜欢).
    • 上面的正向后行断言正则会匹配到我喜欢后面的一个内容
    • 那反向后行断言就会匹配到除了我喜欢后面那个内容以外的其他任意内容


文章作者: 林木木
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 林木木 !
评论
  目录