正则表达式’s Study
本文最后更新于17 天前,其中的信息可能已经过时!

前言

正则表达式一般用不到,用到不是一般难受,别说写脚本了,用notepad++替换个字符都费老鼻子劲了

看似很复杂,其实就是几个语法,学会了确实好用

正则基础语法

. 点运算符

用于匹配任何一个单个的字符,换行符除外

如果要搜索字符 . 需要进行转义 \.

[] 字符集

用于匹配字符集中的任意一个字符 [ie]ver 可以匹配 ever 和 iver,其他的就不能匹配了

注意 许多语法的符号在字符集中会被默认认定为 字符而不能进行相应的作用

^ 否定字符集

有两个作用,第一个是从每行的开始进行匹配(不常用)^The 就是匹配 The而且必须在每行的开始

另一个就是用于否定字符集 (常用) 用于否定整个字符集

[^im]ver 就是匹配任意 ver 且前面的字符不是 i 也不是 m

* 号多字符匹配

* 号可以将 * 号之前的哪一个字符出现的次数不进行限制

ab* 可以匹配 a ab abb等字符串(字符集也算做一个字符) .*搭配可以通配所有字符

+ 号至少一个字符匹配

加号的前一个字符至少出现一次 er+r 表示e和r之间有一个或者多个r的字符串

e.+r 表示er中间有字符的所有字符串

?号表示不定

问号前面的字符可以出现一次或者不出现 [ab]?cd 表示匹配acd bcd cd

.*re 尽可能长的进行匹配

.*?re 尽可能短的进行匹配

{ } 号 限制次数

{ }限制前面一个字符出现的次数 { } 的后一个参数可以忽略,或者只写一个参数

[0-9]{4,6} 匹配数字出现4-6次 [0-9]{4, } 匹配数字至少出现4次

[0-9]{2} 匹配数字出现两次

( ) 括号 特征标群

将内部的所有的字符看做一个整体

| 或运算符

表示或者 ctf|(T|t)he 表示匹配 ctf 和 (T|t)he 字符串也就是The 和 the

\ 用于转义字符

\. \+ 用于匹配相应的字符

^ 和 $ 指示开头结尾

$ 用于指示一行的结尾,^ 用于指示一行的开头

he$ 表示以he结尾 下图可以很明显的看出

正则语法扩展

字符集的简写

  • \w 匹配所有的大小写字母和数字和下划线 [0-9a-zA-z_]
  • \W 匹配所有的非大小写字母数字和下划线 [^\w]
  • \d 匹配数字 [0-9]
  • \D 匹配所有非数字 [^0-9]
  • \s 匹配所有空格字符 [\t\n\f\r\p{Z}]
  • \S 匹配所有非空格字符 [^\s]
  • \f 匹配一个换页符
  • \n 匹配一个换行符
  • \t 匹配一个制表符
  • \v 匹配一个垂直制表符
  • \p 匹配\r\n

?=xxx 正先行断言

格式为 ?=xxx ,表示符合xxx的字符串 注意该断言只是用来匹配但是不会被纳入最终结果,且在目标字符串之后

re(?=\s) 表示后面跟着空格的 re 字符串

?!xxx 负先行断言

理解上面的正先行,这个的作用就是相反的表示符合xxx之外的

?<=xxx 正后发断言

跟在匹配的字符串的前面

(?<=The\s)re 表示The和空格后面的re字符串

?<!xxx负后发断言

是上一个的非除与断言中匹配的字符串外的字符串

限制

  • i 忽略大小写
  • g 全局搜索
  • m 每行的开头与结尾用 ^ 和 $ 进行匹配

/re/g 全局搜索 re /re/gi 全局搜索并且忽略大小写

如果后面选定了/m那么需要用 ^ 和 $ 符号对每一行的开头与结尾进行匹配

Python re 库实例

常见匹配查询

match 是从头开始比较没找到直接None, search 是从对整个字符串比较, findall 是将所有的符合条件的全部输出出来是一个 list

import re
str1 = "Cats are smarter than dogs \nCtf-all-in-one is useful \nTat rere"
print(str1)

out1 = re.match("[C|T]at",str1)
print(out1,"-->",out1.group())  #  <re.Match object; span=(0, 3), match='Cat'> --> Cat
out1 = re.match(".re",str1)
print(out1,"-->")               #  None -->
out2 = re.search("[C|T]at",str1)
print(out2,"-->",out2.group())  #  <re.Match object; span=(0, 3), match='Cat'> --> Cat
out2 = re.search(".re",str1)
print(out2,"-->",out2.group())  #  <re.Match object; span=(5, 8), match='are'> --> are
out3 = re.findall("[C|T]at",str1)
print(out3)                     #  ['Cat', 'Tat']

re.complie 编译正则

编译一个正则表达式,可以调用其他函数

import re
str1 = "Cats are smarter than dogs 333 \nCtf-all-in-one is useful 111 \nTat rere 222"
print(str1)

patten = re.compile(r"\d+")
out4 = patten.findall(str1)
print(out4)                     #  ['333', '111', '222']
out5 = patten.search(str1)
print(out5,out5.group())        #  <re.Match object; span=(27, 30), match='333'> 333

re.finditer 迭代器

匹配所有的正则,返回一个迭代器

import re
str1 = "Cats are smarter than dogs 333 \nCtf-all-in-one is useful 111 \nTat rere 222"
print(str1)

out6 = patten.finditer(str1)
for i in out6:
print(i,i.group()) # <re.Match object; span=(27, 30), match='333'> 333
# <re.Match object; span=(57, 60), match='111'> 111
# <re.Match object; span=(71, 74), match='222'> 222

re.sub 替换

import re
str1 = "Cats are smarter than dogs 333 \nCtf-all-in-one is useful 111 \nTat rere 222"
print(str1)

out7 = patten.sub('AAA',str1)
print(out7)
# Cats are smarter than dogs AAA 
# Ctf-all-in-one is useful AAA 
# Tat rere AAA

re.split 分割

import re
str1 = "Cats are smarter than dogs 333 \nCtf-all-in-one is useful 111 \nTat rere 222"
print(str1)

out8 = patten.split(str1)
print(out8)                      #  ['Cats are smarter than dogs ', ' \nCtf-all-in-one is useful ', ' \nTat rere ', '']

如果本文对您有帮助,能否给个一键三连 (bushi)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇