正则重要!正则重要!正则重要!

 

 

一丶字符组


普通字符组

概念:字符组是正则表达式最基本结构之一,顾名思义,字符组就是一组字符

功能:表示在正则表达式中,在同一个位置可能出现的各种字符

分类:字符可以分为很多类,比如数字丶字母丶标点等.

例如:

简单字符组,[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])?

 

多选结构

| 表示或者.有一个匹配就能成功.

引用分组

反向引用

 

命名分组

 

 

 

 

四丶断言

 

posted on 2018-06-14 21:54  仓鼠大人爱吃肉  阅读(132)  评论(0编辑  收藏  举报