一 正则表达式,又称规则表达式,英文名为Regular Expression,在代码中常简写为regex、regexp或RE,是计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。实现过滤的功能。
1元字符
w 匹配字母(包含汉字),数字,下划线
d 匹配十进制数字
s 匹配空白字符
匹配换行符
匹配制表符
^ 匹配字符串的开始
$匹配字符串的末尾
a|b 匹配a或者b
[ ]字符集,只能取其中的一个。字符集只有三个特殊符号:^ : 取反,,例如[^a-z] :例如 [d] - :例如 [a-z]
[^.. ] 匹配除了字符集内所有的字符外的字符
2 量词
每个量词只控制前一个字符的出现次数
默认模式是贪婪匹配
量词后面加?,为非贪婪匹配
*
+
?
{ }
3 惰性匹配
?
举例:
d?? 第一个问号表示0个或1个,第二个问号表示惰性运算,取0个。
.*? 取尽量少的任意字符。一般用在。*?x,表示取前面任意长度的字符,直到第一个x出现。
4 ( ) 分组 对多个字符进行整体的量词约束
| 或
二 re模块的方法
1 findall,返回列表, 在findall中优先显示( )内的东西。(?:)取消优先级。
import re print(re.findall('www.(baidu|google).com','www.baidu.com')) print(re.findall('www.(?:baidu|google).com','www.baidu.com'))
输出:
['baidu'] ['www.baidu.com']
2 match ,如果没有找到,返回值是None。如果不为空,调用返回值的group( )方法。
3 search ,如果没有找到,返回值是None。如果不为空,调用返回值的group( )方法。
针对match,seach,一般是这样用。
import re res=re.match('d+?','123abv') if res: print(res.group())
输出:1
4 split,切割。加上( ) ,保留被分割的对象。
print(re.split('d','abc123qwe')) print(re.split('(d)','abc123qwe'))
输出:
['abc', '', '', 'qwe'] ['abc', '1', '', '2', '', '3', 'qwe']
5 sub,替换,与字符串的replace方法一样,默认全部替换,同样也可以指定替换的个数。
import re print(re.sub('d','A','123abc',1)) print(re.sub('d','A','123abc',))
输出:
A23abc
AAAabc
6 compile 将正则表达式编译成一个正则表达式对象。后面直接用正则表达式对象调用re模块方法,就可以了。
import re obj=re.compile('d+') print(obj.match('123abv').group())
输出: 123
7 finditer 。
返回的结果是一个迭代的。
for循环遍历得到的元素,本质上是调用match方法得到的,所以然后调用元素的group( )方法。
import re res=re.finditer('d','abc123qwe') print(res,type(res)) for i in res: print(type(i),i.group())
输出:
<callable_iterator object at 0x000001C573FE6DA0> <class 'callable_iterator'> <class '_sre.SRE_Match'> 1 <class '_sre.SRE_Match'> 2 <class '_sre.SRE_Match'> 3
8 (?P< xxx>)的用法
import re res=re.search('<(?P<tag>div id="logo".*?)>','<div id="ntp-contents"><div id="logo" title="Google"></div><div id="fakebox"><div id="fakebox-text"></div><input id="fakebox-input" autocomplete="off" tabIndex="-1" type="url"aria-hidden="true"><div id="cursor"></div>') print(res.group('tag'))
输出:
div id="logo" title="Google"
9 re.S 含义:.可以匹配包括换行符在内的所有字符。
三 举例
匹配小数 点是特殊字符,必须转义
import re print(re.findall('d+.d+','2.14'))
匹配整数 解决了我的一个心头问题
import re res=re.findall('d+.d+|(d+)','2.14,50,12') while '' in res: res.remove('') print(res)
四 关于group的说明。
官方文档:https://docs.python.org/3.6/library/re.html#re.match.group
s = 'https://www.baidu.com?user=zuo&password=123' res = re.search('?(.*?)&(.+)',s) # print(res) print(res.group()) print(res.group(1)) print(res.group(2)) print(res.group(2,1)) print(res.group(1,2))
输出:
?user=zuo&password=123 user=zuo password=123 ('password=123', 'user=zuo') ('user=zuo', 'password=123')
group中的数字代表的是正则匹配是对应的第一个小括号!