1.re模块的使用方式
# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则匹配表达式,要匹配的字符串)
# 如果上一步匹配到数据的话,使用group方法提取数据,否则返回None
result.group()
import re
pattern = compile(r'匹配规则', re.I)
# re.I 忽略大小写
# re.S 表示全文匹配
pattern.match('需匹配的字符串')
2.表示字符
字符 | 功能 |
---|---|
. | 匹配任意字符,除了(\n) |
[ ] | 匹配[ ]列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字 |
\s | 匹配空格,即空格,tab建 |
\S | 匹配非空格 |
\w | 匹配单词字符,即a-z,A-Z,0-9,_ |
\W | 匹配非单词字符 |
re.match(‘1\d\d’,’123’)
re.match(‘1[123]\d’, 123)
re.match(‘1[^123]\d’, ‘123’) # 在方括号里面写’^’,表示取反
3.表示数量
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次 |
+ | 匹配前一个字符出现1次或者无限次 |
? | 匹配前一个字符出现1次或者0次 |
{m} | 匹配前一个字符出现m次 |
{m,} | 匹配前一个字符至少出现m次 |
{m,n} | 匹配前一个字符出现从m次到n次 |
re.match(‘1[13578]/d{9}’,’13345678901’)
4.原始字符串
# 在字符串中如果出现'\',需要使用原始字符串进行匹配
re.match(r'\\nabc', '\\nabc')
5.表示边界
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词边界 |
re.match(r’^1[35678]\d{9}$’,’18111111111’)
re.match(r’^\w+\s\bve\b’, ‘ho ve r’)
re.match(r’^.+ve\B’, ‘ho ver’)
6.匹配分组
字符 | 功能 |
---|---|
(?P<’name’>) | 分组起别名 |
(?P=name) | 引用分组名为name分组匹配到的字符串 |
字符 | 功能 | |
---|---|---|
| | 匹配左右任意一个表达式 | |
(ab) | 将括号中字符作为一个分组 | |
\num | 引用分组num匹配到的字符串,如\2,\1 | |
# 匹配1-100之间的数字
re.match(r'[1-9]\d?$|0$|100$', '85')
re.match(r'[1-9]?/d?$|100$', '85')
s = '<h1>匹配分组</h1>'
result = re.match(r'<h1>(.+)</h1>', s)
result.group()
result.group(1)
result.groups()
结果为:
'匹配分组'
'匹配分组'
('匹配分组',)
s = '<html><h1>匹配分组</h1></html>'
re.match(r'<(.+)><(.+)>.+</\2></\1>', s)
s = '<html><h1>匹配分组</h1></html>'
re.match(r'<(?P<key1>.+)><(?P<key2>.+)>.+</(?P=key2)></(?P=key1)>', s)
7.re的高级用法
re.match() # 从起始位置开始往后查找,返回第一个符合规则的,只匹配一次
re.search() # 从任何位置开始往后查找,返回第一个符合规则的,只匹配一次
re.findall() # 所有的全部匹配,返回列表
re.finditer() # 所有的全部匹配,返回的是一个迭代器
re.split() #分割字符串,返回列表
re.sub() # 替换
(1)search
s = 'itcast<h1>itcast<h1>'
re.search(r'\w+<h1>', s)
结果为:
<_sre.SRE_Match object; span=(0, 10), match='itcast<h1>'>
(2)findall
s = 'itcast<h1>itcast<h1>'
re.findall(r'\w+<h1>', s)
结果为:
['itcast<h1>', 'itcast<h1>']
(3)sub
re.sub(r'\d+', '998', 'python=997')
结果为:
python=998
def replace(result):
print(result.group)
r = int(result.group) + 50
return str(r)
re.sub(r'\d+', replace, 'python=100, php=0')
结果为:
100
0
python=150, php=50
s = '<h1>静夜思</h1><h2>窗前明月光</h2>'
re.sub(r'</?\w+>', '', s)
结果为:
静夜思窗前明月光
(4)split
s = 'itcast,php,python-cpp'
re.split(r':|,|-|', s)
结果为:
['itcast', 'php', 'python', 'cpp']
8.贪婪模式和非贪婪模式
python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符
非贪婪则相反,总是尝试匹配尽可能少的字符
在’*’, ‘?’, ‘+’,’{m, n}’后面加上’?’,使得贪婪模式变成非贪婪模式
# 贪婪模式下
s = 'This is a number 234-456-789'
r = re.match(r'(.+)(\d+-\d+-\d+)', s)
r.groups()
结果为:
# 检测到d+有一个数字就可以完成匹配
('This is a number 23', '4-456-789')
# 非贪婪模式下
s = 'This is a number 234-456-789'
r = re.match(r'(.+?)(\d+-\d+-\d+)', s)
r.groups()
结果为:
('This is a number ', '234-456-789')
9.练习
提取网站前面的一部分
s = 'http://www.baidu.com/image?id=35'
re.sub(r'(http://.+?/).*', lambda x:x.group(1), s)
结果为;
http://www.baidu.com/