Python 正则表达式

简介

正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它 “匹配” 了,否则,该字符串就是不合法的。

re 模块

Python 自1.5版本起增加了 re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。

模式描述
.可以匹配任意单个字符除了 \n
*匹配前一个字符0次或者n次
?匹配前一个字符0次或者1次
^表示匹配的字符必须在最前面
$表示匹配的字符必须在最后面
+表示匹配前一个字符1次或者n次
\d+匹配数字
\d匹配单个数字
.*贪心算法,提取最多的内容
.*?非贪心算法,提取内容
x\y
[abc]表示匹配 abc 当中的任意一个字符,可以使用连接符- :例如 [a-z]
[^abc]表示匹配除了列出字符以外的所有字符,是[abc]的补集
{n}表示匹配前面n个字符
{n,}表示匹配至少n个前面的字符
{n, m}表示匹配至少n个最多m个前面的字符

使用括号的话,括号内的是返回的结果。

re 函数

re.S : 正则匹配的时候包括 \n
findall() : 返回匹配的所有结果列表
search() : 返回匹配到的第一个结果
sub() : 替换匹配的结果
compile() : 把正则表达式编译为正则表达式对象

例子

#encoding=utf-8
import re
secret_code = 'hadkfalifexxIxxasdasdaxxsdasdxxasadasdaxxsdaxxs'

# . 的使用举例
a = 'xz123'
b = re.findall('x.', a)

# 匹配前一个字符0次或无限次
# * 的使用举例
a = 'xyxy123'
b = re.findall('x*', a)

# 匹配前一个字符0次或者1次
# ? 的使用举例
a = 'xyx123'
b = re.findall('x?', a)

# 组合方式
# .* 贪心算法,提取最多的内容
b = re.findall('xx.*xx', secret_code)
# .*? 非贪心算法,提取内容
b = re.findall('xx.*?xx', secret_code)

# 使用括号和不适用括号的区别
b = re.findall('xx(.*)xx', secret_code)
# .*? 非贪心算法,提取内容
b = re.findall('xx(.*?)xx', secret_code)

# re.S 的作用是使 find 包括 \n
secret_code = '''hadkfalifexxIxxasdasdaxxs
dasdxxasadasdaxxsdaxxs'''
b = re.findall('xx(.*?)xx', secret_code)
b = re.findall('xx(.*?)xx', secret_code, re.S)

# 对比 findall 和 search 的区别
b = re.findall('xx(.*?)xx', secret_code)
b = re.search('xx(.*?)xx(.*?)xx', secret_code).group(2)

# sub 的使用举例
#替换
b = re.sub('xx(.*?)xx(.*?)xx', "123%d123", secret_code)
b = re.sub('xx(.*?)xx(.*?)xx', "123%d123" % 789, secret_code)

# compile 的用法
pattern = 'xx(.*?)xx'
new_pattern = re.compile(pattern, re.S)
b = re.findall(new_pattern, secret_code)
# ['I', 's\ndasd', 'sda']

# 匹配数字( \d+ 匹配数字连续的依旧连续, \d 匹配数字分成一个一个数字)
a = 'asdasd123123vvvdsdfsd76989aowoie'
b = re.findall('(\d+)', a)
# ['123123', '76989']

参考资料