一、概念
1. 正则表达式(Regular expression)
正则表达式也叫做匹配模式(Pattern),它由一组具有特定含义的字符串组成,通常用于匹配和替换文本。
在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
- 用来简介表达一组字符串的表达式
- 正则表达式是有字符和操作符构成的
- 通用字符串表达框架
- 针对字符串表达“简介”和“特征”思想的工具
- 判断某字符串的特征归属
2. 常见用途
- 表达文本类型的特征(病毒、入侵等)
- 同时查找或替换一组字符串
- 匹配字符串的全部或部分
3. 使用
- 编译:将符合正则表达式语法的字符串转换成正则表达式特征
‘PN’,
‘PYN’,
‘PYTN’,
‘PYTHN’,
‘PYTHON’
正则表达式:P(Y|YT|YTH|YTHO)?N
regex = 'P(Y|YT|YTH|YTHO)?N'
p = re.compile(regex)
#通过方法将符合正则表达式语法的字符串编译为原字符串
二、正则表达式的语法
1. 常用操作符(深入研究)
- 深入研究
操作符 | 说明 | 实例 |
---|---|---|
. | 表示任何单个字符 | |
[] | 字符集,对单个字符给出取值范围 | [abc]表示a、b、c任意一个,[a-z]a到z的单个字符 |
[^] | 非字符集,对单个字符给出排除范围 | [^abc] 表示非a或b或c的单个字符 |
* | 前一个/组字符0次或无限次扩展 | abc*表示ab、abc、abcc、abccc等 |
+ | 前一个/组字符1次或无限次扩展 | abc+表示abc、abcc、abccc等 |
? | 前一个/组字符0次或1次扩展 | abc?表示ab或abc |
| | 左右表达式任意一个 | abc|def 表示abc或def |
{m} | 扩展前一个字符m次 | ab{2}c表示abbc |
{m,n} | 扩展前一个字符m到n次 | ab{2,3}表示abbc和abbbc |
^ | 匹配该字符串为开头的 | ^abc表示abc一定在一个字符串的开头 |
$ | 匹配该字符串为结尾的 | $abc表示abc一定在一个字符串的结尾 |
() | 分组标记,内部只能用| | (abc)表示就是abc,(abc |
\d | 表示数字,等价于[0-9] | 相当于在[]增加0-9 |
\w | 表示单词字符 | 相当于在[]增加[a-z,A-Z,0-9,_],以及下划线 |
实例
2.其他操作符
操作符 | 说明 |
---|---|
.* | 在正则中,使用.*可以匹配所有字符,其中.代表除\n外的任意字符,*代表0-无穷个。 |
3.不确定类型符号
转义符 | 说明 | 示例 |
---|---|---|
\t | 制表符 | |
\n | 换行符 | |
\n\t | 换行且行首空四格 | |
\s | 空格 | |
\r | 回车符 |
\t:多见于正则表达式,\s匹配字符串中的\和s两个字符,因为\在正则中有特殊意义,需要转义,所以前面加上了一个转义符\
4. 示例
操作符 | 说明 |
---|---|
\s+ | 表示连续多个空格,至少一个。在HTML中 表示空格,但不能在正则表达式中出现。 |
r'<[^>]+>' | 匹配HTML所有标签<tag> |
[\d\.]* | 任意数字,可以是小数 |
r'\"view_price\"\:\"[\d\.]*\"' | 如下: |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
r | '\" | view_price | \" | \: | \" | [ | \d | \. | ] | * | \" | ' |
相当于匹配:
“view_price”:"任意数字,可以是小数
"
- 1:
r'......'
正则表达式字符串部分 - 2:
\"
代表" - 3:
view_price
字符串 - 4:
\"
同2 - 5:
\:
代表: - 6:
\"
同2 - 7:
[...]
在[]中间内容的范围内的字符串 - 8:
\d
代表数字 - 9:
\.
代表"." - 10:同7
- 11:
*
0或多次扩展 - 12:
\"
同2 - 13:同1
三、Re库的基本使用
1. 表示类型
- 正则表达式使用**原生字符串(Raw String)**来表达。例如:
r'text'
r'[1-9]\d{5}' # 中国邮政编码
r'\d{3}-\d{8}|\d{4}-\d{7}' #中国电话号码
- 与字符串的区别:不包含转义符""的字符串,即
"\"
不代表转义符。如果使用String来表示正则表达式:
'[1-9]\\d{5}' # 中国邮政编码
'\\d{3}-\\d{8}|\\d{4}-\\d{7}' #中国电话号码
2. 主要功能函数
re.search(pattern, string,flags=0)
- pattern:正则表达式的字符串或原生字符串表示
- string:待匹配的字符串
- flags:正则表达式使用时的控制标记
- 常用标记
常用标记 | — | 说明 |
---|---|---|
re.I | re.IGNORECASE | 忽略正则的大小写,[A-Z]能够匹配小写字母 |
re.M | re.MULTILINE | 正则中的^操作符能够将给定字符串的每行当做匹配开始 |
re.S | re.DOTALL | 正则中的. 操作符能够匹配所有字符,默认匹配除换行外的所有字符 |
match = re.search(r'[1-9]\d{5}','BIT 100081')
if match:
print(match.group(0))
100081
re.match(pattern, string,flags=0)
- 参数说明同search
match = re.match(r'[1-9]\d{5}','BIT 100081')
if match:
print(match.group(0))
#返回空,因为match是从'BIT 100081'起始位置匹配正则,
如下则有返回值:
match = re.match(r'[1-9]\d{5}','100081 BIT')
if match:
print(match.group(0))
100081
re.findall(pattern, string,flags=0)
- 参数说明同search,findall返回列表类型
re.findall(r'[1-9]\d{5}','BIT100081 TSU100084')
Out[7]: ['100081', '100084']
re.split(pattern, string,maxsplit=0,flags=0)
- 参数说明同search
- maxsplit:最大分隔数,剩余部分作为最后一个元素输出
re.split(r'[1-9]\d{5}','BIT100081 TSU100084')
Out[6]: ['BIT', ' TSU', '']
re.finditer(pattern, string,flags=0)
- 参数说明同search
- 返回一个迭代类型
for m in re.finditer(r'[1-9]\d{5}','BIT100081 TSU100084'):
if m:
print(m.group(0))
100081
100084
re.sub(pattern, repl,string,count=0,flags=0)
- 参数说明同search
- repl:替换匹配字符串的字符串
- count:匹配的最大替换次数
## 3. 正则表达式对象
-re的等价用法
上述方法称为“函数使用法”,正则等价用法是面向对象用法,即一次编译正则表达式后,赋值给一个pattern对象。加快整个程序运行。
```python
pat = re.compile(r'[1-9]\d{5}')
rst = pat.match('BAT 10086')
re.compile(pattern,flags = 0)
将正则表达式字符串形式编译为正则表达式对象
- pattern:正则表达式的字符串或原生字符串表示
- flags:正则表达式使用时的控制标记
方法
与re主要函数相同,区别在于要讲re对象函数的参数:pattern去掉。
四、Match对象
<class ‘_sre.SRE_Match’>
重要属性
属性 | 说明 |
---|---|
.string | 表示match匹配结果所对应的文本 |
.re | 表示匹配时使用的pattern对象(正则表达式) |
.pos | 正则表达式搜索文本的开始位置 |
.endpos | 正则表达式搜索文本的结束位置 |
常用方法
方法 | 说明 |
---|---|
.group(0) | 获得匹配后的字符串 |
.start() | 匹配字符串在原始字符串的开始位置 |
.end() | 匹配字符串在原始字符串的结束位置 |
.span() | 返回(.start(),.end()) |
import re
m = re.search(r'[1-9]\d{5}','BIT100081 TSU100084')
m.string
Out[15]: 'BIT100081 TSU100084'
m.re
Out[16]: re.compile(r'[1-9]\d{5}', re.UNICODE)
#该方法输出的是带有compile标识的,说明在程序内容认为只有经过compile解析之后的才是程序理解的正则表达式,而正则表达式字符串是一种表示。
m.pos
Out[17]: 0
m.endpos
Out[18]: 19
m.group(0)
Out[19]: '100081'
m.start()
Out[20]: 3
m.end()
Out[21]: 9
m.span()
Out[22]: (3, 9)
m.groups()
Out[23]: ()
#search只返回一个结果,所以不可以使用groups(),只有返回多个结果的方法可以使用。
match.groups()方法
>>> import re
>>> match = re.match(r"/(.*)/(.*)/(.*)/", "/usr/local/bin/")
>>> match.groups()
('usr', 'local', 'bin')
Re库的贪婪匹配和最小匹配
默认贪婪匹配
Re库默认采取贪婪匹配方式,及输出匹配到的最长的字符串
m = re.search(r'PY.*N','PYANBNCNDN')
m.group(0)
Out[27]: 'PYANBNCNDN'
最小匹配
在正则表达式中增加"?",
m = re.search(r'PY.*?N','PYANBNCNDN')
m.group(0)
Out[31]: 'PYAN'