【python】模块初识之re模块

re模块

1、匹配: findall  search  match

import re

# 操作的对象是字符串

#1、 匹配

# 1.1 findall  重要

ret = re.findall('\d+','19874ashfk01248')

print(ret)  # 传参格式:'正则表达式','字符串'   返回值类型:列表   返回值内容:所有匹配上的项

ret1 = re.findall('\s+','19874ashfk01248')

print(ret1) #如果匹配不上返回的是空列表

 

# 1.2 search   重要

ret2 = re.search('\d+','@$19874ashfk01248')

print(ret2,type(ret2)) #传参格式:('正则表达式','字符串') 返回值类型: 正则匹配结果的对象  如果匹配上了就返回对象,返回值类型是正则表达式的内容

if ret2:print(ret2.group())  #返回的对象通过group来获取,只取匹配到的第一个结果

ret3 = re.search('\s+','19874ashfk01248')

print(ret3) #如果没有匹配上,返回值类型: None

# 1.3 match  

ret4 = re.match('\d+','19874ashfk01248')

print(ret4) #若匹配到只取第一个结果

ret5 = re.match('\d+','%^19874ashfk01248')

print(ret5) #match默认从开头匹配,开头匹配不上直接返回None

#re.search('^\d+','19874ashfk01248') 正则表达式里开头加^  效果一样的

 

2替换 sub   subn

# sub 

#相当于repalce的用法

print('replace789,24utdeedeeeeshf'.replace('e','H',3)) #把字符串中H替换成e,替换3次

ret = re.sub('\d+','H','replace789nbc2xcz392zx') #按正则表法式把字符串中匹配到的替换成H

print(ret)

ret1 = re.sub('\d+','H','replace789nbc2xcz392zx,48495',1)

print(ret1)

# subn 

ret2 = re.subn('\d+','H','replace789nbc2xcz392zx')

print(ret2)  #会把替换的次数返回

 

3切割 split

# split ***

# print('alex|83|'.split('|'))

# ret = re.split('\d+','alex83egon20taibai40')

# print(ret) #结果:['alex', 'egon', 'taibai', '']

4进阶方法 compile   finditer

- 爬虫\自动化开发

# 4.1 compile 预编译***** 时间效率

# ret = re.compile('-0\.\d+|-[1-9]\d+(\.\d+)?')

# res = ret.search('alex83egon-20taibai-40')

# print(res.group())

# 节省时间 : 只有在多次使用某一个相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率

# finditer 生成迭代器***** 空间效率

# print(re.findall('\d','sjkhkdy982ufejwsh02yu93jfpwcmc'))

# ret = re.finditer('\d','sjkhkdy982ufejwsh02yu93jfpwcmc')

# for r in ret:

#     print(r.group()) #使用.group()打印内容

 

5、分组:python中的正则表达式:

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

  #split 遇到分组会保留分组内被切掉的内容

  #search 如果search中有分组的话,通过group(n)就能够依次拿到group中分组匹配的内容

#1、findall分组优先

ret1 = re.findall('www.baidu.com|www.oldboy.com','www.oldboy.com')

print(ret1)

ret2 = re.findall('www.(baidu|oldboy).com','www.oldboy.com')

print(ret2)

ret3 = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')

print(ret3)

 

ret1 = re.findall('-0\.\d+|-[1-9]\d*(\.\d+)?','-1abc-200')

print(ret1)

ret2 = re.findall('-0\.\d+|-[1-9]\d*(?:\.\d+)?','-1abc-200')

print(ret2)

 

#2、split遇见分组,会返回被切割的内容

ret = re.split('\d+','alex83egon20taibai40')

print(ret)

ret = re.split('(\d+)','alex83egon20taibai40')

print(ret)

 

#3、search遇见分组

ret = re.search('\d+(.\d+)(.\d+)(.\d+)?','1.2.3.4-2*(60+(-40.35/5)-(-4*3))')

print(ret.group())

print(ret.group(0))

print(ret.group(1))

print(ret.group(2))

print(ret.group(3))

 

作业:

#只取整数:

import re

ret1=re.findall(r"\d+(?:\.\d+)?","1-2*(60+(-40.35/5)-(-4*3))")

print(ret1)  #获取的是所有

ret2=re.findall(r"\d+(?:\.\d+)|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")

print(ret2)

ret2.remove('')

print(ret2)

 

#表单页签

import re

ret = re.findall('>(\w+)<',r'<a>wahaha<\a>')

print(ret)

ret = re.search(r'<(\w+)>(\w+)</(\w+)>',r'<a>wahaha</a>')

print(ret.group())

print(ret.group(1))

print(ret.group(2))

 

#分组命名

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

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

    # 通过索引使用分组

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

 

import re 

ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>")

print(ret.group('name'))

print(ret.group()) 

#使用(?P<name>)和(?P=name),字符串里对象前后名必须一致,否则会报错

ret = re.search(r'<(?P<tag>\w+)>(?P<c1>\w+)</(?P<c2>\w+)>',r'<a>wahaha</b>')

print(ret.group())

print(ret.group('tag'))

print(ret.group('c1'))

print(ret.group('c2'))

ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")

print(ret.group(1))

print(ret.group())  

 

猜你喜欢

转载自www.cnblogs.com/xlzhangq/p/13211316.html