正则重要!正则重要!正则重要!
一丶字符组
普通字符组
概念:字符组是正则表达式最基本结构之一,顾名思义,字符组就是一组字符
功能:表示在正则表达式中,在同一个位置可能出现的各种字符
分类:字符可以分为很多类,比如数字丶字母丶标点等.
例如:
简单字符组,[ab]、[314]、[#.?]在解决常用问题时,可以简化大大操作
注:perl语言是正则表达式处理最方便的语言
python基础知识
import re
(1)re.search(正则表达式,要匹配的字符串):找到字符中是否有要匹配的值,返回一个MatchObject对象,包含匹配信息,用group[索引]方法提取数据,有则返回True,否则False
(2)re.findall(正则表达式,要匹配的字符串):返回一个数组,其元素在字符串中依次寻找的目标文本
(3)re.match(pattren,string,flags=0):尝试从字符串起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
(3)
^定位到字符串起始位置
$定位到字符串结束位置
普通字符组(续)
字符组中的字符排列顺序不影响字符组的功能,出现重复字符也不影响字符组的功能
所以[0123456789]完全等价于[9876543210]丶[1029384756]丶[998887654123]
范围表示法range,[0-9]等于[123456789]等于[123789456]
码值小的在前,码值大的在后.所以[0-9]合法[9-0]非法
补充:码值问题
0~9是48~57 a~z是97~122,A~Z是65~90
\xhex表示一个字符,其中x是前缀,如\x41表示字符A,A的码值是41(十进制为65)
不推荐[0-Z]这样不好阅读.不好理解
例子:
匹配十六进制,十进制字符
[0-9a-fA-F]
判断ASCII字符
[\x00-\x7F]
元字符与转义
元字符:字符组中的横线"-"不表示横杠而表示的是范围,这类字符叫元字符,在匹配中元字符有特殊的意义
元字符的种类:
横线 -
开方括号[ 需要转义
闭方括号] 不需要转义
所有开头^
所有结尾$
匹配任意字符 . (数字字母各种符号)但换行符点号不能匹配
元字符的转义:有时候不需要特殊的意义,这就用到元字符的转义了
在元字符前加上反斜线字符\用来转义
位置不同意义不同
[-09]代表-,0,9
[0-9]代表数字0~9
[-0-9]代表数字0~9和横线-
原生字符串r"string":字符串中\会被认为是转义序列,使用\\等于\,等一系列麻烦的问题都会通过r" "解决
r"^[0\-9]$"=="^[0\\-9]$"
排除型字符组
排除字符组:[^]除了范围内的字符
注意:看似简单的排除字符组,新手常常会犯一个错误,把"在当前位置匹配一个没有列出的字符",理解为"在当前位置不要匹配列出的字符"后者不出现字符也可以.
所以排除型字符组必须要匹配一个字符
字符组简记法
用[0-9]和[a-z]可以很方便的表示数字字符和小字母字符,这类常用的字符组,正则表达式提供了更简单的记忆法,这就是字符组简记法
常见字符组简记法为:
.匹配任意字符,但除了换行符
\d匹配所有数字[0-9]
\w匹配所有数字,字母或下划线[0-9a-zA-Z]
\s匹配所有空白[ \t\r\n\v\f] 空格,制表,回车,换行
与上面互补
\D
\W
\S
互补则匹配任意字符如:[\d\D]
补充:
字符组中出现了字符组简记法,最好不要出现单独的-
\d\w\s都是针对ASCII码而言的匹配规则.但目前有的语言已经支持了Unincode
二丶量词
一般的形式
例如{6}重复六次的量词表达
{m,n}m下限,n上限
{n}之前元素必须出现n次
{m,n}之前的元素最少出现m次,最多出现n次
{m,}之前元素最少出现m次,最多出现次数无上限
{0,n}之前的元素可以不出现,也可以出现,最多出现n次
常用的量词
{m,n}是通用形式的量词
+ {1,}至少出现一次,出现次数没有上限
? {0,1}出现1次,也可能不出现
* {0,}可能出现,也可能不出现,出现次数没有上限
匹配标签字符
匹配所有标签r"<[^>]+>"
匹配开标签]r''<[^/] [^>]*>''
匹配闭标签r"</[^>]+>"
匹配半开标签r"<[^>+/]>"
匹配双引号字符r" "[^"]*" "
数据提取
除去验证,还可以从某个字符串中提取出某个字符串能匹配的所有文本
ret = findall(r"\d{6}","cangshu:202020,cangshu:202020")找出匹配的数据以数组返回结果[''202020'',"303030"]
for i in ret: i的值为202020 303030
点号
.匹配任何字符
.*表示匹配长度没有限制(贪婪匹配或者叫匹配优先量词),不确定匹配时优先匹配,再尝试表达式之后的元素
.?表示(惰性匹配又叫忽略优先量词),不确定匹配时优先不匹配,再尝试表达式之后的元素,如果尝试失败则返回匹配
转义
\{,n}
\* \*\?
\? \?\?
\+ \+\?
\代表转义之前
三丶括号
分组
()用于分组将一组正则作为一个整体匹配,再用量词来限定
例如身份证匹配
15位身份证:[1-9]\d{14}首位不为0其他14位数字随意
15位或18位:[1-9]\d{14}(\d{2}[0-9x])?
多选结构
| 表示或者.有一个匹配就能成功.
引用分组
反向引用
命名分组
四丶断言