正则表达总结

    xiaoxiao2021-03-25  96

    \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

    最新回复(0)