python学习Day26--正则表达式2

【知识点】

1、转义符:\

  在python中,从正则表达到打印\n:r '\\n'   r '\n'

  \( ——表示匹配小括号          [ ( )+*?/$. ]——在字符组中一些特殊字符会现原形

2、re 模块

  (1)字符串(匹配)

  ① findall(★★★★★)

1 import re
2 
3 ret=re.findall('\d','snfe2462rcn453')
4 print(ret)  # ['2', '4', '6', '2', '4', '5', '3']
5 # 参数:先写正则表达,在写字符串
6 # 返回值类型:列表
7 # 返回值个数:1个
8 # 返回值内容:所有匹配上的项

  ② search(★★★★★)

 1 import re
 2 
 3 ret2=re.search('\d+','snfe2462rcn453')
 4 print(ret2) # <_sre.SRE_Match object; span=(4, 8), match='2462'>
 5 print(type(ret2)) # <class '_sre.SRE_Match'>
 6 print(ret2.group()) # 2462
 7 
 8 ret3=re.search('\s+','snfe2462rcn453')
 9 print(ret3) # None
10 
11 # 参数:先写正则表达,在写字符串
12 # 返回值类型:正则匹配结果的对象
13 # 返回值个数:1个  如果匹配上了就返回对象,没有就返回None
14 # 返回值内容:返回的对象通过group()来获取匹配到的第一个结果

  ③ match(★★):只从头开始匹配。(可以通过search实现,在search正则表达式前加^)

1 import re
2 
3 ret4=re.match('\d+','123snfe2462rcn453')
4 print(ret4) # <_sre.SRE_Match object; span=(0, 3), match='123'>
5 ret5=re.match('\d+','snfe2462rcn453')
6 print(ret5) # None

  (2)替换——replace

  ① sub(★★★)

 1 import re
 2 
 3 ret1=re.sub('\d','H','replace1234')
 4 print(ret1)  # replaceHHHH
 5 
 6 ret2=re.sub('\d','H','replace1234',2)
 7 print(ret2)  # replaceHH34
 8 
 9 ret3=re.sub('\d+','H','replace1234gerrwrc456')
10 print(ret3)  # replaceHgerrwrcH
11 
12 ret4=re.sub('\d+','H','replace1234gerrwrc456',1)
13 print(ret4)  # replaceHgerrwrc456

  ② subn

1 import re
2 
3 ret1=re.subn('\d+','H','replace1234dfseg234')
4 print(ret1)  # ('replaceHdfsegH', 2)  返回元组,并显示替换的次数

  (3)切割

  ① split(★★★)

1 import re
2 
3 ret1=re.split('\d+','alex83egon20taibai40')
4 print(ret1)  # ['alex', 'egon', 'taibai', '']

  (4)进阶方法——爬虫\自动化开发

  ① compile(★★★★★):预编译

1 import re
2 
3 ret1=re.compile('-0\.\d+|-[1-9]\d+(\.\d+)?')  # 预编译
4 ret2=ret1.search('rfnc-20n rrn-40eb')
5 print(ret2.group()) # -20
6 # 节省优点:只有在多次使用某一个人相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率

  ② finditer(★★★★★):空效率

1 import re
2 
3 ret=re.finditer('\d','jsgerk455fjkn2255vyv445')
4 for r in ret:
5     print(r.group())  # 迭代出拿到的每一个数字

3、正则表达式和python的re模块

 (1)python中的正则表达式的两个坑

  ① findall——会优先显示分组中匹配的内容,要想取消分组优先显示:(?:正则表达式)

 1 import re
 2 
 3 ret=re.findall('www.baidu.com|www.oldboy.com','www.oldboy.com')
 4 print(ret)  # ['www.oldboy.com']
 5 
 6 ret1=re.findall('www.(baidu|oldboy).com','www.oldboy.com')
 7 print(ret1) # ['oldboy']  (优先显示)
 8 
 9 ret2=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
10 print(ret2) # ['www.oldboy.com'] (取消分组优先显示)
11 
12 # 举例:
13 ret3=re.findall('-0\.\d+|-[1-9]\d*(\.\d+)?','-1ffsdcsv-200')
14 print(ret3)  # ['', ''] 因为-1与-200均以被前面的匹配,而分组的没有匹配上,就出现了空
15 
16 ret4=re.findall('-0\.\d+|-[1-9]\d*(?:\.\d+)?','-1ffsdcsv-200')
17 print(ret4)   # ['-1', '-200']  取消了分组优先显示

  ② split——遇到分组,会保留分组内被切掉的内容在列表中

1 import re
2 
3 ret1=re.split('(\d+)','alex83egon20taibai40')
4 print(ret1)  # ['alex', '83', 'egon', '20', 'taibai', '40', '']

  (2)分组遇见search——如果search中有分组的话,通过group(n)就能够拿到group中匹配的内容

1 import re
2 
3 ret=re.search('\d+(\.\d+)(\.\d+)(\.\d+)?','1.2.3.4-2*(60+(-40.35/5)-(-4*3))')
4 print(ret.group())  # 1.2.3.4
5 print(ret.group(1)) # .2
6 print(ret.group(2)) # .3
7 print(ret.group(3)) # .4

  分组练习:

1 # 举例:
2 import re
3 
4 ret=re.findall(r'\d+(?:\.\d+)|(\d+)','1-2*(60+(-40.35/5)-(-1*3))')
5 ret.remove('')
6 print(ret)  # ['1', '2', '60', '5', '1', '3']
1 # 举例2:
2 ret1=re.search('<(\w+)>(\w+)</(\w+)>','<a>wahaha</a>')
3 print(ret1)
4 print(ret1.group(1)) # a
5 print(ret1.group(2)) # wahaha
6 print(ret1.group(3)) # a

  (3)分组命名(进阶)

    就上述例2,<a>wahaha</a>前后都是a,这就涉及到了分组命名了。

     ①(?P<name>正则表达式)表示给分组起名字,

         (?P=name)表示使用这个分组,这里匹配都的内容应该和分组中的内容完全相同。

    ②  通过索引使用分组

      \1 表示使用第一组,匹配到的内容必须和第一个组中的内容完全一致

 1 import re
 2 
 3 # 写法一 ?P<name>   ?P=name
 4 ret1=re.search('<(?P<name>\w+)>\w+</(?P=name)>','<a>wahaha</a>')
 5 print(ret1.group())  # <a>wahaha</a>
 6 print(ret1.group('name')) # a  通过名字获取
 7 
 8 # 写法二  采用索引\1
 9 ret1=re.search(r'<(\w+)>\w+</(\1)>','<a>wahaha</a>')
10 print(ret1.group())  # <a>wahaha</a>

  (4)flags有多种可选值

    re.I(IGNORECASE) 忽略大小写,括号内是完整的写法

    re.M(MULTILINE) 多行模式,改变^和$的行为

    re.S(DOTALL) 点可以匹配任意字符,包括换行符

【注】正则表达式的参考书:正则指引(python)


时间:2020-02-19     23:27:44

猜你喜欢

转载自www.cnblogs.com/fengxb1213/p/12332584.html
今日推荐