python 正则表达式
常用re模块的表示方式
字符
\d 匹配数字
\D 匹配非数字
\s 匹配空白符
. 匹配除换行符以外的所有字符
\b 匹配单词的开始后者结束
\w 匹配字母或数字或下划线或汉字
^ 匹配字符的开始
$ 匹配字符的结束
次数
* 匹配零次至无限次
+ 匹配一次至无限次
? 匹配零次至一次
{n} 匹配n次
{n,} 匹配n次之无限次
{n,m} 匹配n次至m次
常用5种方法:match, search, findall,split,sub,
match
match(pattern, string, flags=0)
从开始位置开始匹配,成功返回一个对象,未匹配返回None
import re a = "asdsfsfhaj67772hhsdja" result1 = re.match("as\w?", a) print(result1.group()) result2 = re.match("(a)(s)\w?", a) print(result2.groups()) result3 = re.match("(?P<n1>a)(?P<n2>s)\w?", a) print(result3.groupdict()) 运行结果: asd ('a', 's') {'n2': 's', 'n1': 'a'}
search
search(pattern, string, flags=0)
浏览整个字符匹配第一个,未匹配返回None,(用法跟match出不多)
import re a = "sdsfsfhasj67772hhsdja" result1 = re.search("as\w?", a) print(result1.group()) result2 = re.search("(a)s\w?", a) print(result2.groups()) result3 = re.search("(?P<n1>a)(?P<n2>s)\w?", a) print(result3.groupdict()) 结果: asj ('a',) {'n2': 's', 'n1': 'a'}
findall
findall(pattern, string, flags=0)
获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;
空的匹配也会包含在结果中
import re a = "asdsfsfhasj67772hhasysdja" #无分组 result1 = re.findall("as\w?", a) print(result1) #有分组 result2 = re.findall("a(s)(\w)s",a) print(result2) 结果: ['asd', 'asj', 'asy'] [('s', 'd'), ('s', 'y')]
sub
替换匹配成功的字符串
sub(pattern, repl, string, count
=
0
, flags
=
0
)
pattern: 正则模型
repl : 要替换的字符串或可执行对象
string : 要匹配的字符串
count : 指定匹配个数
flags : 匹配模式
import re a = "i like coding" result = re.sub("like", "love", a) print(result) 结果: i love coding
split
根据正则匹配分割字符串 (可以用来写简单的计算器)
split(pattern, string, maxsplit
=
0
, flags
=
0
)
pattern: 正则模型
string : 要匹配的字符串
maxsplit:指定分割个数
flags : 匹配模式
import re a = "y like coding" result = re.split("i", a) print(result) 结果: ['y l', 'ke cod', 'ng']
正则表达式的另一种方法
regex = re.compile(pattern, flags=0)