正则表达式-----是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。
可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
构建方法-------用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。(即小的表达式)
普通字符:包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
非打印字符:
1:\cx-------x为a-z或A-Z中的一个,代表control-x(任意可选字符)
例:\cM-----匹配一个回车符
2:\f-------匹配换页符,相当于\x0c 或 \cL
3: \n-----匹配一个换行符,相当于\x0a 或 \cJ
4: \r-----匹配一个回车符,相当于\x0d 或 \cM
5: \v------垂直制表符,,相当于\x0b 或 \cK
6: \s-----匹配任何空白字符,包括空表,制表符,换页符。等价于[\f\n\r\v].
7:\S-----匹配任何非空白字符
7: \t-----匹配一个制表符,等价于\x09 或 \cl.(制表符:即空格键)
特殊字符:
1:*:匹配前面的子表达式零次或多次
2:+:匹配前面的子表达式一次或多次
--*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
3:?:匹配前面的子表达式零次或一次 或指明一个非贪婪限定符
4:\:将下一个标定为特殊字符,或原义字符、或向后引用、或八进制转义符
5:|:指明两项之间的一个选择,先匹配左边的,如果左边符合就跳出。
(a|b):a或b
a+b|a*b:a+b或a*b
6:^:匹配字符串的开始位置,在[]内部使用代表不接受该集合,
如果设置了 RegExp 对象的 Multiline(接受多行属性) 属性,^ 也匹配 '\n' 或 '\r' 之后的位置,
7:$:匹配字符串的结尾位置
^ $:在没有multiline属性时,代表一行的开始和结尾。
8:():标记一个子表达式的开始和结束位置。
()会被缓存
非捕获元素:
?:------非捕获:不可以被之后引用
?=------正向肯定预查:
?!------正向否定预查:
?<=-----反向肯定预查:
9:.:匹配出换行符(\n、\r)以外的任意字符,[.]之匹配'.'这个字符。
10:[]:中括号表达式
11:{}:限定符表达式
-----限定符:给定组件必须要出现多少次才能满足匹配,即指示前面的子表达式出现的次数
限定符:
1:*
2:+
3:?
4:{n}:n 是一个非负整数。匹配确定的 n 次
5:{n,}:n 是一个非负整数。至少匹配n 次。
6:{n,m}: m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
定位符:----将正则表达式固定到行首或行尾,正则表达式出现在一个单词内,
在一个单词的开头或者一个单词的结尾。
字符串的开始与结束
1:^:匹配字符开始处的文本。或多行文本中一行的开头
例:/^Chapter [1-9][0-9]{0,1}/-----匹配一个章节标题,该标题只包含两个尾随数字,并且出现在行首
/^Chapter [1-9][0-9]{0,1}$/-----即出现在行首又出现在同一行的结尾(即一行只有该标题存在)
2:$:匹配字符结束处的文本。或多行文本中一行的结尾。
单词的开始与结束
3:\b:匹配一个字边界,即字与空格间的位置。'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
4:\B:非字边界匹配。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
注意:不能将限定符与定位符一起使用
预定义字符集:
1:\d:任意数字
\D:任意非数字
2:\s:任何空白字符[<空格>\t\n\r\f\v]
\S:任意非空白字符
3:\w:匹配字母或数字或下划线
\W:匹配非字母 数字 下划线
4:\xn:十六进制转义符
5:\n:标识一个八进制转义值或一个向后引用。
如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
6:\num: num 是一个正整数代表获取的组号,向后引用
例:'(.)\1' 匹配两个连续的相同字符。
不常用:
7:\nm:标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n
为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
8:\nml:如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
9:\un:匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
pythoy中的re模块:
1:re.compile:把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。
2:re.match(pattern,num(开始下标),num(结束下标), string, flags=0/是否区分大小写,多行匹配等等/):从(起始位置开始)往后查找,返回第一个符合的----若无,返回none
print(re.match('com', 'www.runoob.com'))----返回none,因为字符串的前三个字母不为com
3:re.search(pattern, string, flags=0/是否区分大小写,多行匹配等等/):从(任意位置开始)往后查找,返回第一个符合的----若无,返回none
4:re.findall:所有全部匹配,返回列表
5:re.finder:返回迭代器
6:re.split():分割字符串,返回列表
例:re.split(r'\s+', text);将字符串按空格分割成一个单词列表
7:re.sub(pattern, repl, string, count):替换:其中repl代表替换为,count代表替换个数(默认为0,表示每个匹配项都替换。)
以上返回的是re对象,使用group()取出。
span()返回去除对象的下标。从0开始
8:group(num):返回获取的第num个;
group()或group(0):返回所有
常见的flag:
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。