3.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{1,2}c 表示 abc,abbc
^ 匹配字符串开头。^ abc 表示abc且在一个字符串的开头
$ 匹配字符串结尾。 abc$ 表示 abc且在一个字符串的结尾
( ) 分组标记,里面和 | 连用。 (abc)表示abc,(abc|def)表示abc,def
\d 数字,等价 [ 0-9]
\w 单词字符,等价 [ A-Za-z0-9]
P(Y|YT|YTH|YTHO)?N
# PN, PYN, PYTN, PYTHN, PYTHON
PYTHON+
# PYTHON, PYTHONN, PYTHONNN..
PYT[TH]ON
# PYTTON, PYTHON
PY[^TH])ON
# PYON, PYaON, PYbON
经典正则表达式
^[A-Za-z]+$
#由26个字母组成的字符串
^-?\d+$
# 整数表达,可能含有负号
^[0-9]*[1-9][0-9]*$
#正整数的表达
#IP地址表达
0-99: [1-9]?\d
100-199: 1\d{2}
200-249: 2[0-4]\d
250-255:25[0-5]
t =[1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]
((t).){3}(t)
3.2 Re库的基本使用
import re
raw string 类型表示,不包含转义符。r‘text’
re.search(): 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
re.match(): 在一个字符串的开始位置匹配正则表达式,返回match对象
re.findall(): 搜索字符串,以列表类型返回全部能匹配的子串
re.split():将一个字符串按照正则表达式匹配进行风格,返回列表类型
re.finditer(): 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素都是match对象
re.sub():在一个字符串中代替所有匹配正则表达式的子串,返回替代后的字符串
3.3 re.search( ) , re.match (), re.findall(), re.split(), re.finditer()
re.search(pattern, string, flags =0)
在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
import re
search = re.search(r'[1-9]\d{5}, 'BIT 100081')
if search:
print (search.group(0))
re.match(pattern, string, flags =0)
在一个字符串的开始位置匹配正则表达式,返回match对象
match = re.match(r'[1-9]\d{5}, 'BIT 100081')
# Traceback Errors
match = re.match(r'[1-9]\d{5}, '100081 BIT')
# '10081'
re.findall(pattern, string, flag =0)
搜索字符串, 以列表的形式返回全部匹配的字符串
ls = re.findall(r'[1-9]\d{5}, 'BIT 100081 TSU10084')
# ['100081', '100084']
re.split(pattern, string, maxsplit =0, flags =0)
将一个字符串按照正则表达式匹配进行风格,返回列表类型
maxsplit() 最大分割数,剩余部分作为最后一个元素输出
re.split(r'[1-9]\d{5}, 'BIT 100081 TSU10084')
#['BIT', 'TSU', ' ']
re.finditer(pattern, string, flags =0)
搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素都是match对象
for m in re.finditer(r'[1-9]\d{5}, 'BIT 100081 TSU10084')
if m:
print m
# 100081
# 100084
re.sub(pattern, repl, string, count =0, flags =0)
在一个字符串中代替所有匹配正则表达式的子串,返回替代后的字符串
re.sub(r'[1-9]\d{5}, ':zipcode', 'BIT 100081 TSU10084')
'BIT:zipcode TSUf:zipcode'
3.4 Re库的等价用法
rst = re.search(r'[1-9]\d{5}', 'BIT 100081')
==
pat = re.compile(r'[1-9]\d{5}')
rst = pat.search('BIT 100081')
3.5 re中的match对象
.string 待匹配的文本
.re 匹配时使用的pattern对象(正则表达式)
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的结束位置
m= re.match(r'[1-9]\d{5}, 'BIT 100081')
m.string
# 'BIT 100081'
m.re
# re.compile('[1-9]\\d{5}')
m.pos
# 0
m.endpos
# 19
m.group(0)
#'10081'
3.6 Re库的贪婪匹配
Re库默认采用贪婪匹配,即输出匹配最长的字串
最小匹配操作符
*? 前一个字符 0次或者无限次 扩展, 最小匹配
+? 前一个字符1次或者无限次 扩展, 最小匹配
?? 前一个字符0次或者1次 扩展,最小匹配
{m,n}? 扩展一个字符m至n次(含n次),最小匹配
match = re.search(r'PY.*N', 'PYANBNCNDN')
match.group(0)
# 'PYANBNCNDN'
match = re.search(r'PY.*?N', 'PYANBNCNDN')
match.group(0)
# 'PYAN' '(最小匹配)