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

正则表达式


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 达到特殊效果
  • (?: ): 只匹配内容,不会在内存中记录分组信息。( 丢弃匹配 )
    • 当你用\1这种方式的时候 就不会匹配到丢弃匹配的组
  • (?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

断言实例 ( 预搜索 )


  • 如果我们希望正在写的词语出现在另一个词语之前或之后,我们需要使用「零宽断言」。

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

  • (?=正则): 直接讲不容易懂,直接上实例

  • \d(?=PM) 这个断言 \d是数字 那么就是匹配 \d后面跟着必须是PM

    • 比如 匹配5PM 9PM 不会匹配 1PP
  • 注意这里匹配到的是 前面的数字 而后面的PM是不会被匹配的

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

  • 这个就和上面相反 上面是匹配 这里是不匹配
  • \d(?!PM) 这个断言匹配的就是 数字后面跟着的不是PM
  • 6PP 可以被匹配到 6PM匹配不到
  • 注意这里匹配到的是前面的6 后面的 PP是匹配不到的

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

  • 匹配某正则前面是否符合正则 (?<=\$)\d
  • 上面的正则会匹配到 $5 也就是一个数字前面 必须跟着的是$符号 其中\代表转义
  • 而不会匹配到 &5 @2等情况
  • 注意这里匹配到的是数字 5 而不是 $5

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

  • 匹配正则前面是否符合正则 (?<!\$)\d
  • 这个和就是匹配 数字\d之前 不是 $符号的情况
  • 也就是会匹配到 #2 &1 但是不会匹配到 $5
  • 注意这里匹配到的是21不是 #2 &1


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