正则表达式是处理字符串的强大工具,可以实现字符串的检索,替换,匹配等等,首先我们可以使用一个正则测试工具:http://tool.oschina.net/regex/
符号 | 说明 |
---|---|
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字及下划线 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f] |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9] |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
. | 匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’ 或 ‘k’ |
[^…] | 不在 [] 中的字符:匹配除了 a,b,c 之外的字符。 |
* | 匹配 0 个或多个的表达式 |
+ | 匹配 1 个或多个的表达式 |
? | 匹配 0 个或 1 个由前面的正则表达式定义的片段,非贪婪方式 |
{n} | 精确匹配 n 个前面表达式 |
{n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
( ) | 匹配括号内的表达式,也表示一个组 |
re库
在Python中写正则表达式基本上都是用这个库
match(): 用于检测是否匹配字符串
import re
content = 'Hello 123 4567 World_This is a Regex Demo'
print(len(content))
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}', content)
# 这里相当于hello后面匹配一个空格,三个数字,一个空格,四个数字,10个字母数字及下划线
print(result) # 这是一个对象
print(result.group()) # 返回匹配的结果
print(result.span()) # 返回匹配的范围
如果要从字符串中提取一部分内容,可以使用:
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\sWorld', content)
print(result)
print(result.group())
print(result.group(1)) # group(1) 会输出第一个被 () 包围的匹配结果
print(result.span())
通用匹配:!!!经常用到
万能匹配,也就是 .* (点星),代表匹配任意字符
import re
content = 'Hello 123 4567 World_This is a Regex Demo'
result = re.match('^Hello.*Demo$', content)
# 这里匹配出以hello开头demo结尾的字符串
贪婪和非贪婪:
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$', content)
# 目标是获取中间的数字
print(result)
print(result.group(1)) # 得到的是7
原理:贪婪匹配模式下,点星会匹配尽可能多的字符,\d+表示至少一个数字,所以点星就尽可能多匹配,留给\d+一个7,所以Group(1)返回一个7。我们可以使用非贪婪匹配.*?
就可以得到中间的数字,非贪婪模式就是尽可能匹配到少的字符,所以我们在字符串中间尽量使用非贪婪匹配
修饰符:
result = re.match('^He.*?(\d+).*?Demo$', content, re.S)
这第三个参数的含义是匹配包括换行符在内的所有字符。
网页匹配中最长用到,re.I和re.S,re.I表示对匹配大小写不敏感。
特殊字符前面加反斜杠就可以转义
=============================================================
search():
match()只能从字符串的开头开始匹配,所以很不方便。
有另外一个方法 search(),它在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果,所以我们尽量使用search()
=============================================================
findall():
search是找到第一个结果,但是如果想找到所有的结果,就使用findall:
results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S)
print(results)
print(type(results))
for result in results:
print(result)
print(result[0], result[1], result[2])
===========================================================
sub():
需要用正则的方式修改文本可以使用sub()
import re
content = '54aK54yr5oiR54ix5L2g'
content = re.sub('\d+', '', content)
print(content)
有时候我们可以用这种方法将不需要的信息全部删减掉,然后再提取我们需要的信息
=============================================================
compile():
这个方法可以将正则字符串编译成正则对象,以便后面复用:
import re
content1 = '2016-12-15 12:00'
content2 = '2016-12-17 12:55'
content3 = '2016-12-22 13:21'
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)