正则表达式
1.简介
1.1概念
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,
组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
1.2 应用场景
- 表单验证(eg:手机号、邮箱、身份证…)
- 爬虫
2.正则表达式对python的支持
在python中自带正则表达式库re,下面使用re库中match()函数进行正则表达式的匹配。
2.1 re简单应用
import re
'''
match(pattern, string, flags=0)
第一个pattern 正则表达式 如果匹配成功 返回一个match对象 如果匹配失败返回一个None
第二个string 表示要匹配的字符串
第三个flags=0 标致位 用于控制正则表达式的匹配方式 如 是否区分大小写 是否换行匹配
'''
pattern = 'pythonn' # 正则表达式
s = 'pythonn and java' # 要匹配的字符串
result = re.match(pattern,s)
if result:
print(result.group())# 匹配到的字符串
print(result.start())# 开始索引
print(result.end()) # 结束索引
print(result.span()) # 索引元组(开始索引,结束索引)
else:
# print(result)
print('没有匹配到数据')
2.2 re库的主要方法
方法 | 描述 |
---|---|
match (pattern,string,[,flags]) | 从起始位置开始查找,一次匹配 。 |
search(pattern,string,[,flags]) | 从任何位置开始查找,一次匹配 。 |
findall(pattern,string,flags) | 全部匹配,返回列表 。 |
split(pattern,string[,maxsplit=0,flags] | 分割字符串,返回列表 |
sub(pat,repl,string,[,count=0,flags]) | 替换 。 |
compile(pattern,string,[,flags]) | 用来编译正则表达式模式字符串,并生成 Regular Expression Objects。 |
3.正则表达式语法
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
3.1 普通字符
“普通字符”:字母、数字、汉字、下划线及没有特殊定义的符号。
正则表达式中的普通字符在匹配时只匹配与自身相同的一个字符。
eg:
pattern = 'c' # 正则表达式
str = 'abcde' # 待匹配字符
# 匹配成功,匹配的内容就是'abcd'中的'c',下标是2
3.2 元字符
除普通字符外的特殊字符(称为"元字符")。
3.2.1 限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配,用于重复匹配。
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。 |
+ | 匹配前面的子表达式一次或多次。 |
? | 匹配前面的子表达式零次或一次。 |
{n} | n 是一个非负整数。匹配确定的n次。 |
{n,} | n 是一个非负整数。至少匹配n次。 |
{m,n} | 最少匹配m次且最多匹配n次。 |
3.2.2 定位符
定位符使您能够将正则表达式固定到行首或行尾。定位符用来描述字符串或单词的边界,
正则表达式的定位符有:
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
3.2.3 特殊字符
许多元字符要求在试图匹配它们时特别对待。下表列出了正则表达式中的特殊字符:
字符 | 描述 |
---|---|
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. |
| | 指明两项之间的一个选择。 |
[] | 匹配字符集中的一个 |
[^] | 字符集的反操作,^ 必须在[] 里的最前面。 |
- | 定义[] 里的一个区间,eg[a-z] |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’ 则匹配 “(”。 |
() | 对表达式进行分组,将圆括号内的内容当作一个整体,并获得匹配的值。 |
一些无法书写【非打印字符】或者具有特殊功能的字符,若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如,\cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL 。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ 。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM 。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] 。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] 。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI 。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK 。 |
3.2.4 预定义匹配字符集
正则表达式的一些表示方法,可以同时匹配某个预定义字符集中的任意一个字符。
字符 | 描述 |
---|---|
\d | 任意一个数字,0-9中的任意一个 |
\w | 任意一个字母或数字或下划线,即A-Z、a-z、0-9、_中的任意一个 |
\s | 空格、制表符、换页符等空白字符中的任意一个 |
\D | \d 的反集 |
\W | \w 的反集 |
\S | \s 的反集 |
3.3. 贪婪模式和非贪婪模式
- 贪婪:尝试匹配尽可能多的字符
- 非贪婪:尝试匹配尽可能少的字符
- 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
贪婪:下面的表达式匹配从开始小于符号 (<) 到关闭 h1 标记的大于符号 (>) 之间的所有内容。
/<.*>/
非贪婪:如果您只需要匹配开始和结束 h1 标签,下面的非贪婪表达式只匹配
。
/<.*?>/