正则表达式
三个查找
findall 查找所有匹配的字符 如果有组则会优先只抓去组内的字符
import re p = refindall("www.(baidu|google).com","www.baidu.com") print(p) #此时结果为["baidu"]
如果findall查找的条件是“”字符串的话,那么结果为比查找的字符串多一位。
import re p = re.findall('','lichao') print(p) #结果为 ['','','','','','','']
import re f = "hello alex" p = re.findall("(a)(\w+(e))(x)",f) print(p) #按括号的层级一级一级提取,从外到内,从左到右,第一次执行最外层括号,所以提取a,le,,第二次执行括号里面的提取,提取e,第三次提取x 所以结果是 a le e x 。如果再加括号还是相同道理。
import re f = "hello alex" p = re.findall("(a)((\w+)(e))(x)",f) print(p) #结果为 第一层括号那出a,le,第二层括号拿出,l,e,第三次拿出x。所以结果为 a le l e x。另外在findall 中加?P<>也是不起作用的。
finditer 与findall的区别是一个返回数组,一个返回迭代器。
import re p = re.compile(r'\d+') w = p.finditer('12 drumm44ers drumming,11...10...') for match in w: print(match.group(),match.span()) # 结果为 12 (0, 2) 44 (8, 10) 11 (23, 25) 10 (28, 30)
import re f = "hello alex" p = re.finditer("(a)((\w+)(e))(?P<n1>x)",f) for i in p : print(i.group(),i.groups(),i.groupdict()) #对于可迭代的finditer拿字符就需要用循环语句了。alex ('a', 'le', 'l', 'e', 'x') {'n1': 'x'}
search查找到第一个匹配的字符,如果没有返回none,如果group则报错。
import re ppp = "hello alex i am 19" r = re.search('a(\w+).*(?P<name>\d)$',ppp) print(r.group()) # 输出全部字符 print(r.groups()) # 输出 ('lex', '9') print(r.groupdict()) # 输出 {"name" :"9"}
group 输出符合的所有 加s是输出组 dict输出字典。
match查找开头的匹配字符,如果没有返回none,如果group则报错。
两个替换
sub 替换 第一个是要替换的字符串,第一个是更换后的条件,第三个是要更换的字符串,第四位是换几次。
import re p = re.sub("p","re","pppoee") print(p) #结果为rerereoee
import re p = re.sub("p","re","pppoee",2) print(p) #结果是rerepoee
subn 就是多了一个条件,多返回一个替换的次数。
import re p = re.subn("p","re","pppoee",) print(p) #('rerereoee', 3)
一个分割 split
compile 定义一个查找规则
import re p = re.compile(r"\d") text = "lichao123" w = p.findall(text) print(w) #结果为['1','2','3']
import re p = re.compile(r"\d") text = "lichao123" w = re.findall(p,text) print(w)
元字符
\d 斜杠符匹配所有数字,[0-9].
import re p = re.findall('\d','123 qqQ Q ') print(p) #结果为['1', '2', '3']
\D 匹配所有非数字, [^0-9].
import re p = re.findall('\D','123 qqQ Q ') print(p) #结果为[' ', 'q', 'q', 'Q', ' ', 'Q', ' ']
\s 匹配所有空字符,空格TAB []
import re p = re.findall('\s','123 qqQ Q ') print(p) #[' ', ' ', ' ']
\S 匹配所有非空字符,
import re p = re.findall('\S','123 qqQ Q ') print(p) #['1', '2', '3', 'q', 'q', 'Q', 'Q']
\w 匹配所有数字及字母,[aA-zZ0-9]
import re p = re.findall('\w','123qqQQ ') print(p) #输出结果为['1','2','3','q','q','Q','Q']
\W 匹配所有非数字及字母,[^aA-zZ0-9]
import re p = re.findall('\W','123 qqQ Q ') print(p) #输出结果为[' ',' ',' ']
\b 边界。指空白符或标点等等。

\2 那么如果在条件里则重复第2组。
import re p = re.findall(r'(alex)(tom)(lichao)\2','alextomlichoatom') print(p) # 输出为[('alex','tom','lichao')] import re p = re.search(r'(alex)(tom)(lichao)\2',alextomlichaotom).group() print(p) #alextomlichaotom
. 点 通配符,表示通配所有的字符。
import re p = re.findall('a.d','acd''aed') print(p) #结果为['acd' 'aed']
* 星号重复0次或多次
import re p = re.findall('alex*','alexxxxxx') print(p) #*会一直重复条件最后一位的0次会多次,也就是说如果字符串是ale也可以输出,但是同样的条件+号不行因为至少有依次。 import re p = re.findall('alex*','ale') print(p) #输出结果为ale
+ 加号重复1次或多次
import re p = re.findall('alex+','alexxxxxx') print(p) #如果是加号则输出1次或多次,结果为alexxxxxx。 import re p = re.findall('alex+','ale') print(p) #因为找不到字符,输出空列表[],所以+号代表至少得有一次。
? 重复0到1次
import re p = re.findall('alex?','alexxxxxx') print(p) #如果是?则是找到0-1次的结果,如果有就输出"alex' import re p = re.findall('alex?','ale') print(p) #如果没有就显示‘ale’。
+? 匹配一次的
import re p = re.findall('alex+?','alexx') print(p) #输出alex 如果匹配ale 则输出空列表[]。
*? 匹配0到1次 等同于 一个问号的作用
import re p = re.findall('alex*?','alexxxx') print(p) #结果是alex p = re.findall('alex*?','ale') print(p) #结果为ale
^ 尖角符 表示从头开始匹配 写在条件前面
import re p = re.findall('^alex','alexqweqweq') print(p) #输出是['alex'],如果字符串是qqalexqweqweq,那么输出[]。
$ 刀符 表示从末尾开始匹配 写在条件后面
import re p = re.findall('alex$','alexqweqweqalex') print(p) #输出['alex'],如果末尾是'alexqweqweqalexqq',答案是[]。
{ } 花括号符 表示循环之前的条件几次
import re p = re.findall(r'a{5}','aaaaa') print(p) #重复花括号内的东西,结果是输出['aaaaa']。
[ ] 字符集 或者关系,匹配前后条件与字符集其中一个,写在字符集里表示去除所有特殊功能。
import re p = re.findall('a[.e]b','a.b') print(p) #结果为a.b 因为去除了. 的特殊功能。 import re p = re.findall('a[bc]d','abc') print(p) #结果是abc,符合bc其中的一个。
在字符集中有一些字符还是正常使用的,比如- 多少至多少 ^尖角符,尖角符为非的意思。[0-9]的意思是所有数字,意思等同于\d
import re p = re.findall('[0-9]','1234') print(p) #输出['1','2','3','4'] import re p = re.findall('[^0-9]','1234qqq') print(p) #输出的结果为['q','q','q']

浙公网安备 33010602011771号