正则表达式
python 使用正则表达式(re)来进行匹配引擎搜索
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”
关于正则表达式,必须先学会它的元字符
元字符 : ^ $ * + ? { } [ ] | ( )
. 匹配除 (换行符)以外的任何字符,若指定flag DOTALL,则匹配任意字符,包括换行
s = re.findall('b...u', 'www.baidu.com www') >>> ['baidu']
^ 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a"," abc eee",flags=re.MULTILINE)
s = re.findall('^w.w', 'www.baidu.com wWw') >>> ['www']
$ 匹配字符结尾,或e.search("foo$","bfoo sdfsf",flags=re.MULTILINE).group()也可以
s = re.findall('w.w$', 'www.baidu.com wWw') >>> ['wWw']
* 匹配*号前的字符0次或多次
s = re.findall('abc*', 'abccccccc') >>> ['abcccccc'] s = re.findall('abc*', 'ab') >>> ['ab']
+ 匹配前一个字符1次或多次
s = re.findall('abc+', 'abccccccc') >>> ['abcccccc']
? 匹配前一个字符1次或0次
s = re.findall('abc?', 'abccccccc') >>> ['abc']
{n} 匹配前一个字符n次,即前一个字符至少出现n次
s = re.findall('abc{2}', 'abccccccc') >>> ['abcc']
{n,m} 匹配前一个字符n到m次
s = re.findall('abc{2,3}', 'abccccccc') >>> ['abccc']
| 匹配|左或|右的字符
s = re.findall('abc|ABC', 'abcABC') >>> ['abc', 'ABC']
() 提取括号中的内容
s = re.findall('(bai)', 'www.baidu.com') >>> ['bai']
[ ] 字符集:1、[ab] 取a或b 2、字符集里的符号没有特殊的意义 3、尖角号^取反 4、选择出某种元素
# 1、[] 里面的元素取其一 s = re.findall('[aid]', 'www.baidu.com') >>>['a', 'i','d'] # 2、消除符号的特殊意义 s = re.findall('[*]', 'abccccccc*') >>>['*'] # 3、取反 s = re.findall('[^abc]', 'abcABC') >>>['A', 'B', 'C'] # 4、选择元素(数字或字母) s = re.findall('[a-z]', 'ab123c41d2ABeC') >>>['a', 'b', 'c', 'd', 'e']
反斜杠后边跟元字符去除特殊功能,反斜杠后边跟普通字符实现特殊功能
通用字符
A 只从字符开头匹配,re.search("Aabc","alexabc") 是匹配不到的 匹配字符结尾,同$ D 匹配非数字 S 匹配任何非空白字符 W 匹配非[A-Za-z0-9] d 匹配数字0-9,十进制数字 w 匹配[A-Za-z0-9],匹配任一字母、数字、下划线 s 匹配空白字符、 、 、 , re.search("s+","ab c1 3").group() 结果 ' '
模式修正符,一般放在最后位置
I re.I 不区分大小写
M re.M 多行匹配,改变'^'和'$'的行为
S re.S 点任意匹配模式,改变'.'的行为
常用的匹配语法
re.findall() # 完全匹配,把所有匹配到的字符放到以列表中的元素返回 re.findall('com','www.baidu.com map.baidu.com') >>> ['com', 'com'] re.match() # 从头开始匹配 re.match('com','www.baidu.com map.baidu.com') >>> None re.search() # 搜索匹配,仅返回一个结果;通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 re.search('com','www.baidu.com map.baidu.com').group() >>> com re.split() # 按照能够匹配的子串将字符串分割后返回列表。maxsplit用于指定最大分割次数,不指定使用默认值0将全部分割 re.split('d','www.1baidu2.3com',2) # 默认为0,即全部分隔;指定次数后只分隔两次 >>> ['www.', 'baidu', '.3com'] re.split(' ','www.baidu.com map.baidu.com') # 分隔空格 >>> ['www.baidu.com', 'map.baidu.com'] re.sub() # 匹配字符并进行替换 re.sub('d','ai','www.b1du.com ',1) # 替换一次 >>> www.baidu.com re.subn() # 与 sub 函数完全一致,只不过其返回值是包括两个元素的元组:(new_string, number);第一个返回值 new_string 为sub 函数的结果,第二个 number 为匹配及替换的次数。 ret=re.subn('d','ai','www.b1du.com map.b2du.com',2) # 替换两次 >>> ('www.baidu.com map.baidu.com', 2)
re 模块的两种匹配模式
贪婪模式:尽可能多的去匹配
惰性模式:尽可能少的去匹配(后面加?号来限制)