定义
正则表达式简单的理解就是一些字符和特殊符号组成的字符串,用以描述特定的字符,从而进行文本匹配、搜索等功能。
python中使用re模块来支持,r’’表示正则。u’’ 表示unicode。
表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。
正则表达式内容主要包括:表示方法、函数、标识符。
表示方法
简单的分为四类: 符号,括号,\..(特殊符号)、扩展正则。
符号(^,$ . 重复?、+、* 、|):
| :管道或
''." :匹配\n外任意字符
^ :匹配开头。注:方括号内^代表非 [^a]——除了a字符
$ :匹配结尾
a*: 0或多次a字符
a+:1次或多次a字符
a?:匹配0次或1次a字符
括号(大中小):
{} :区间范围——匹配字符出现次数
{m} 匹配m次出现的次数。例 1900-01-10 ,取年份 (\d){4}
{m,n} 匹配m~n次前面出现的次数。
{,n} 匹配0-n次字符
re默认贪婪模式 baaaaa a{3,5} 结果是全匹配。非贪婪模式a{3,5}?——baaa。加“?“即可
[]:字符集——匹配字符集中的某一个字符
小写字符匹配 : [a-z]
数字匹配: [0-9]
非大写字符: [^A-Z]
例:b[ae]t 匹配bat或者bet
():截取匹配的内容分组
正则表达式中匹配到字符串后,将想取的字符串()起来,指定分组,便可随后用group获取。
特殊字符(\d,\w,\s,\b,\c ) ——其中小写和大写含义相反
\d (digital): 同 [0-9],匹配数字。 \D 即匹配非数字
\w(word): 同[0-9a-zA-Z_],匹配单个字符。 反\W
\s (space) : 匹配单个空格。反\S
\b(border) :匹配边界。简单的就是^,$ 是行中的开头结尾。\b用来设置字符串的开头和结尾
\bthe 匹配the开头, the\b 结尾。 \bthe\b 如a the b,仅匹配单词the。
反之 \B。 \Bthe 匹配任何包含the的字符串
扩展正则——条件正则:
形式:(?...)
作用:条件检查
(?Limuxs)快捷使用标识符。可以使用多个,但大小写需要注意。
例:re.findall(r'(?i)yes','yes.YES.Yes') 等同于re.findall(r'yes','yes.YES.Yes',re.I)。
(?=.com) 元素之后是 .com 才进行匹配操作。
(?!=.com) 元素之后不是 .com 才进行匹配操作。
(?<=…) 元素之前是才进行匹配操作。
(?:....)re.split(r'(?:,|;|\s)\s*', line), 不保存匹配到的分组
(?(1)y|x) 三元运算:组1存在匹配y,否则,匹配x
(?P<group_name>)分组
(?P=group_name) 调用前面的分组。注意这里,后向引用是匹配前面的内容,而不是表达式。
问题:
1)re.findall(r'(?<=<\w+>).+?(?=</a>)','<a>this is a demo</a><p>demo two</p>')
出现 “look-behind requires fixed-width pattern”、
python的re模块只支持定长的断言,前后都不能变长。
函数:
编译:re.compile(pattern,flags=0)
用来编译一个正则表达式,返回一个正则表达式对象
r = re.compile('\bthe\b',re.I)
re.match(r, 'the book is mime')
编译提升效率、
查找:re.match()、re.serach()、re.findall()、re.finditer()
match() 和search() 要匹配的内容,在正则里用()分组,然后用group()取出
re.match('pattern, string, flags=0)
pattern 为搜索内容的正则,string为缩写字符串,flag则为标识符
尝试从字符串的起始位置匹配正则——匹配成功,返回一个匹配的对象。
如果匹配不成功的话,match()就返回None
re.search()
参数同match。它是匹配搜索到第一对象——匹配成功,返回?
如果匹配不成功的话,search() 也返回None
re.findall(pattern,string[, pos[, endpos]])
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
re.finditer(pattern, string, flags=0)
类似findall ,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。迭代器对象.next() 为分组的对象地址,取值还要用group
finditer 迭代器返回值 group()使用需注意
re_a = re.findall(r'(th\w+)', st,re.I)
re_b = re.finditer(r'(th\w+)', st,re.I)
print(re_a)
print(re_b.next().groups())
print(re_b.next().groups())
['This', 'that']
('This',)
('that',)
替换:re.sub(pattern, repl, string, count=0, flags=0)
用repl替换string中的pattern
pattern : 正则中的模式字符串,搜索的字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的
返回值:
res = re.sub(....) 成功匹配,res返回替换后的字符串。未匹配,返回源字符串string
切片:re.split(pattern, string,max = 0 )
max ——最多分隔max次
s = re.split(r'f',a)
用正则来对a分隔。返回的值为列表。
例: re.split(",","a,b,c")
Out[4]: ['a', 'b', 'c']
分组:re.group()
返回匹配到的分组,从1开始。
返回正则表达式匹配的整个字符串 同re.group()
re.groups(), 返回一个包含所有匹配子组的元组
标识符:
正则表达式——默认匹配的内容只有一行(换行符代表结尾)
1)$遇见换行符(\n)即终止。
2) re.S | re.I flag之间通过| 来进行合并
re.I 、re.IGNORECASE : 忽略大小写
re.M、re.MULTILINE 读取多行内容时,同一行里以换行符为分隔匹配(改变$——多个\n多个$)
re.S、re.DOTALL 使.匹配所有字符包括换行\n——可以利用。*实现多行匹配
a = re.findall(r'(\w)l',a ,re.I)
c = re.findall(r'(\w)l',a ,re.I|re.S)
print(a)
print(c)
['2']
re.X、re.VERBOSE 该标志通过给予你灵活的格式
re.L 、re.LOCALE:本地识别匹配
re.U 根据Unicode字符解析字符。
备注:
pycharm中可以安装plugins使用regexpTester,调试正则表达式的正确性。