-正则表达式-
是对字符串操作的一种逻辑公式。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的
- 常见的匹配模式-
模式 | 描述 |
---|---|
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字及下划线 |
\s | 匹配任意空白字符 <==> [\t\n\r\f] |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价[0-9] |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束标识符 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的末尾 |
. | 匹配任意字符,除了换行符 |
[...] | 用来表示一组字符,单例列出 |
[^...] | 不在[]中的字符 |
* | 匹配0或多个的表达式 |
+ | 匹配1个或多个的表达式 |
? | 匹配0或1由前面的正则表达式定义的片段,非贪婪方式 |
(n) | 精确匹配n个前面表达式 |
(n,m) | 匹配n到m次 由前面的正则表达式定义的片段,贪婪方式 |
a\b | 匹配a或b |
() | 匹配括号内的表达式 |
re.match
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配的话,返回none
- 起始位置
[01]re.match> 常规匹配
import re
content = 'hello i have 9999'
result = re.match('^\w{5}\s\w\s\w{4}\s\d{4}$', content)
print(result)
print(len(content)) #长度
print(result.group())
print(result.span()) # 范围
<_sre.SRE_Match object; span=(0, 17), match='hello i have 9999'>
17
hello i have 9999
(0, 17)
[02]re.match> 泛匹配
import re
content = 'hello 123'
result = re.match('^hello.*23$', content)
print(result)
<_sre.SRE_Match object; span=(0, 9), match='hello 123'>
[03]re.match> 匹配目标
import re
content = 'I can do magic Num 123'
result = re.match('^I.*Num\s(\d+)$', content)
print(result)
print(result.group(1)) #显示第一个括号里的数字
<_sre.SRE_Match object; span=(0, 22), match='I can do magic Num 123'>
123
[04]re.match> 贪婪匹配
import re
content = 'hello 1234567'
result = re.match('^he.*(\d+)$', content)
print(result)
print(result.group(1))
<_sre.SRE_Match object; span=(0, 13), match='hello 1234567'>
7
[05]re.match> 非贪婪匹配
import re
content = 'hello 1234567'
result = re.match('^he.*?(\d+)$', content)
print(result)
print(result.group(1))
<_sre.SRE_Match object; span=(0, 13), match='hello 1234567'>
1234567
[06]re.match> 转义
import re
content = 'this apple is $50'
result = re.match('^th.*?is\s\$(\d+)$', content)
print(result) # 注意 金钱后面变为'\$',否则会报错
<_sre.SRE_Match object; span=(0, 17), match='this apple is $50'>
re.search
re.search扫描整个字符串并返回第一个成功的匹配
- 整个字符串
- 返回一个
[01]re.search> 匹配演示
import re
message = """
<li>
<span>Hello</span>
<a> 你好</a>
</li>
"""
mes = re.search("span>(.*?)<.*?a>(.*?)</a>", message, re.S)
print(mes.group(1))
print(mes.group(2))
Hello
你好
re.findall
re.findall搜索字符串,以列表形式返回全部能匹配的子串
[01]re.findall> 匹配演示
import re
import requests
response = requests.get("http://www.taobao.com/")
#print(response.text) #打印了html文档
link = re.findall('href="(.*?)"',response.text, re.S)
for each in link:
print (each)
这样就会打印a标签里面的连接(不完善)
re.sub
re.sub替换字符串中每一个匹配的字串后返回替换后的字符串
import re
content = "My QQ is 569781231"
content = re.sub('\d+', ' it\' s a secret', content)
print(content)
My QQ is it' s a secret
网友评论