\bhi\b 只匹配单词hi 而不会匹配him
\b是元字符(metacharacter)
加入hi后面不远处跟着一个Lucy 则用 \bhi\b.*\bLucy\b
*也是元字符代表数量 即*前边的内容可以连续重复使用任意次使得整个表达式得以匹配
0\d\d-\d\d\d\d\d\d\d\d 即以0开头,然后接两个数字,然后是字符“-”(不是元字符) 接下来是8位数字
也可写成 0\d{2}-\d{8}
正则表达的测试可用 正则表达测试器
元字符:
\s 匹配任意空白符,空格,制表符(Tab),换行符,中文全角空格等
\w 匹配字母,数字,下划线,汉字等
. 匹配除了换行符以外的任意字符
\d 匹配数字
\b 匹配单词开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
eg:
\ba\w*\b 即匹配以a开头的单词
\d+ 即匹配一个或多个连续的数字
\b\w{6}\b 即匹配6个字符的单词
QQ号必须得5~12位 即 ^\d{5,12}$
字符转义:比较简单,暂不考虑
重复:
* 前面的字符重复0次或多次
+ 重复1次或多次
?重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
eg:
Windows\d+ 匹配Windows后面跟1个多更多数字
^\w+匹配一行的第一个单词(或整个字符串的第一个单词)
字符类:
查找数字,字母很简单,通过上面的元字符基本可以匹配,但如果匹配自己预订的字符呢?
[aeiou] 即匹配任意一个元音字符
[.?!] 即匹配任意一个标点符
[0-9] 与\d一样
[a-z0-9A-Z] 与\w一样
\(?0\d{2}[) -]?\d{8} 即匹配(010)12345678这样的电话
\(是转义字符,?表示出现0或1次 然后是[]中的一个出现0或1次
分支条件:
上面的正则有可能匹配到010)12345678这样的电话 要解决此问题得用分支条件
\(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8} 即可解决上问题 解决不了
\d{5}-\d{4}|\d{5} 和 \d{5}|\d{5}-\d{4} 是两码事
美国邮编是5位或 用连号间隔的9位 而第二个正则只能匹配5位邮编或9位邮编的前5位
分组:
上面提到了重复单个字符(即在符号后面加上{}),如果重复多个字符怎么办?可用小括号指定
字表达式(分组),然后指定字表达式的重复次数.
(\d{1,3}\.){3}\d{1,3} 即匹配简单的ip地址
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5][01]?\d\d?)
反义:
想查找不属于某个能简单定义的字符类的字符,即查找除了数字外的其他任意字符
\W 匹配任意不是字母、数字、下划线、汉字的字符
\S 匹配非空白符的字符
\D 匹配非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除x外的任意字符
[^aeiou] 匹配除aeiou这几个字母以外的任意字符
eg:
\S+ 即匹配不包含空白符的字符串
<a[^>]+> 匹配尖括号括起来的以a开头的字符串
后向引用:
使用小括号指定一个表达式后,匹配这个子表示的文本(即分组里的内容)
\b(\w+)\b\s+\1\b 即匹配重复的单词 \1代表(\w+) 两者是一摸一样的. 即匹配 go go 、 kity kity
也可写成 \b(?<Word>\w+)\b\s+\k<Word>\b 即把分组命名为Word,在使用的时候以\k<Word>引用
当然使用小括号时的语法超级多,超级复杂
捕获:
(exp) 匹配exp,并捕获文本到自动命名组里(即可以用\1的这种形式)
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言:
(?=exp) 匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释:
(?#comment) 这种不对正则表达式处理产生任何影响,仅提供注释
零宽断言:
(?=exp) 零宽正预测先行断言,匹配exp前面的位置
eg: \b\w+(?=ing\b) 即匹配以ing结尾的单词的前部分:i'm similing and running 就匹配simil 和runn
(?<=exp)零宽度正回顾后发断言,匹配exp后面的位置
eg: (?<=\bre)\w+\b 即匹配re后面的单词的部分: regular expression 就匹配gular
((?<=\d)\d{3})+\b 对1234567890进行查找的结果为 234567890
(?<=\s)\d+(?=\s) 匹配以空白符间隔的数字(不包括空白符)
负向零宽断言:
没有看懂
\b\w*e[^u]\w*\b 匹配q后面不接u的单词,但是如果这样 love you 则会匹配全部,因为[^u]总要匹配字符
解决方法 \b\w*e(?!u)\w*\b
注释:
2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
贪婪与懒惰:
贪心算法:尽可能匹配更多的字符 .*是最常用的贪婪模式
变贪婪为懒惰加一个?即可 .*?即匹配最短的 a.*?b
*? 重复任意次,但尽可能少重复
+? 重复一次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
看几个案例
line_pattern = re.compile(r'\d+\.\d+\s\S+\s(\S+)\s\[\d+/\w+/\d+:(..):(.).:..\s.0800\]\s(\S+)')
python中的 匹配#1511107206.987 394.913 200 [20/Nov/2017:00:00:06 +0800] 112.65.48.98 "
获取状态码 时间只要00::0 ip
转载请注明原文地址: https://ju.6miu.com/read-16826.html