正则表达式
Posted rprp789
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式,Regular Expression ,缩写为regex regexp、RE等
在编程中,最常打交道的就是字符串,处理最多的就是字符串,
正则表达式是文本处理领域最常用的技术,对字符串按照某种规则检索,或者替换字符串
分类:
BRE :基本的正则表达式,grep、sed、vi等软件支持,vim有扩展
ERE : 扩展的正则表达式,egrep(rgrep-E),sed-r等
PCRE : (Perl Compatible Regular Expressions),几乎所有语言都是PCRE的方言或变种,Python从1.6开始使用SRE正则表达式引擎,可以理解为PCRE的子集,见模块re。
基本语法
元字符 metacharacter
.点,匹配除换行符外的任意一个字符,在Windows下回车换行是两个 ,有时正则表达式会留下一个回车,处理时要注意
[abc] 匹配一个字符,包含在集合中的任意一个字符,[abc]匹配plain中的a
[^abc]除abc外的一个字符,只匹配一个,匹配plain中的‘p‘,‘l‘,‘i‘,‘n‘
[a-z] 字符范围,也是一个集合,只匹配一个字符
[^a-z] 字符范围,也是一个集合,只匹配一个字符,除其中的字符
匹配单词的边界,b表示在文本找到b开头的单词,b为以b结尾的
B 匹配不是字符的边界的字符,
d 匹配[0-9]中的一位
D 匹配一位非数字
s 匹配一位空字符
S 匹配一位非空白字符
w 匹配[a-zA-Z0-9_],包括中文的字,不匹配符号,支持uncode字符,匹配时注意行尾的回车换行,
W 一位非文字
\, , 原意,加转义符来表达原意
多位匹配贪婪模式,匹配找到的最长的字符
* 多次匹配,零或者以上任意次 ,使用.*是注意范围,模式会影响找到的内容,单行模式有可能找到的并不是你要的,
+ 至少一个,{1,}
? 有无{0,1}
{n} 固定重复次数
{n,} 重复n次及以上
{0,} 相当于*,{1,}相当于+
{n,m} {0,1} n要小于m
x|y 匹配 x或者y 注意w|food 和(w|f)ood 的区别,前者会找到w,food
() 分组,或者捕获,使用捕获后会自动分配组号,从1开始,可以改变优先级,匹配带来分组,没有匹配到就不会有分组
(very)s+1 引用分组号1, s+表示中间空白字符一个以上
(?:w|f)ood 表示括号改变优先级,不分组
((?:w|f)ood) 表示分组组名food,wood
(?:<name>exp) python中使用(?P<head>w|f)ood 命名分组
零宽断言
断言不是分组
f(?=ood) (?:=)断言只是条件,不参与匹配,匹配f,ood是条件
(?<=f)ood 匹配ood,f只是条件
负向零宽断言
(?!) 断言f(?!ood)f后一定不是ood,
(?<!)
(?#commend) 注释,少用。写在表达式前后
分组和捕获意思相同
使用时,能用简单就不用复杂
贪婪和非贪婪,
捕获的内容或匹配的内容不同
(.*?) 找到的内容,非贪婪
*? 匹配任意次,尽可能少
??
+?
{2,}? 相当于{2}
?? 和*? 单独使用没有意义,找啥?
加在重复的选项上
引擎的选项
ignoreCase 忽略大小写
Singleline
Mulitline
单行模式可以突破换行符,控制的是换行符,控制的是点能否匹配到换行符
. 点可以匹配包括换行符的字符
^ $ 表示整个字符串的开头和结尾
多行模式
. 匹配除换行符外的所有字符
^$ 控制行首行尾,多行匹配行首尾
结尾注意 加 ?,win下有问题
socket 库,筛选ip地址
从分组组名中提取数据
分隔符取反
你想要的数据中(最不可能出现的值可以作为你取反的值)来求你要的值
取1-999的数字
[1-9]d|[1-9]d|d
[1-9]?dd?
(?!0)d{1,3}
25[0-5]|2[0-4]2[0-4]|1d{0,2}|0
以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章