欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python模块_re模块

程序员文章站 2022-07-10 20:19:06
...
正则表达式笔记
'''
#re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
#re.search 扫描整个字符串并返回第一个成功的匹配
#findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
#re.finditer 和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回
#re.split split方法按照能够匹配的子串将字符串分割后返回列表

re.split(pattern, string[, maxsplit=0, flags=0])
#注意: match 和 search 是匹配一次 findall 匹配所有
# 对于一个找不到匹配的字符串而言,split 不会对其作出分割
函数语法:
re.match(pattern, string, flags=0)
re.search(pattern, string, flags=0)
re.findall(string[, pos[, endpos]])
re.finditer(pattern, string, flags=0)
re.split(pattern, string[, maxsplit=0, flags=0])

#pattern 匹配的正则表达式
#string 待匹配的字符串。
#pos 可选参数,指定字符串的起始位置,默认为 0。
#endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。
#maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
其中的flags则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志如下
修饰符 描述
re.I 使匹配对大小写不敏感 (Ignore case)
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $ (MultiRow)
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
'''
import re
#print(re.match('www', 'www.runoob.com').span())  # match会在起始位置匹配
#print(re.match('com', 'www.runoob.com'))
#print(re.search("[a-z]+[0-5]{3}",'NMasad123354675',flags= re.I).span())#返回匹配的下标号
#print(re.search("[a-z]+[0-5]{3}",'NMasad123354675',flags= re.I))
print(re.findall(r"\d+","1243afjhf1243"[:]))#返回列表
it = re.finditer(r"\d+","1243afjhf1243")
for i in it:
    print(i.group())#group() 返回被RE匹配的字符串
import re
line = "Cats are smarter than dogs"
searchObj = re.search(r"(.*?) (.*?) .*",line, re.M|re.I)
if searchObj:
   print ("searchObj.group() : ", searchObj.group())
   print ("searchObj.group(1) : ", searchObj.group(1))
   print ("searchObj.group(2) : ", searchObj.group(2))
else:
   print ("Nothing found!!")
'''
#我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
'''
#. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式
#* 匹配0个或多个的表达式。会优先考虑有的情况
#+ 匹配1个或多个的表达式。会优先考虑1个的情况
#? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方法
#注意:正则匹配默认是贪婪匹配,也就是匹配尽可能的多的字符

#练习
import re
print("贪婪方法 :",re.match(r"^(\d+)(0*)$","10023400").group(1))#贪婪方法
print("非贪婪方法 :",re.match(r"^(\d+?)(0*)$","10023400").group(1))#非贪婪方法
print(re.split("[,|\\s]+","a b ,  d|aa"))
pattern =re.compile(r"\d+")
print(pattern.search("123sjkfh134").start())
print(pattern.search("123sjkfh134").end())
'''
#检索和替换 re模块提供了re.sub用于替换字符串中的匹配项
语法:re.sub(pattern, repl, string, count=0)
pattern: 正则中的模式字符串。
#repl: 替换的字符串,也可为一个函数。
string: 要被查找替换的原始字符串。
count: 模式匹配后替换的最大次数,默认0表示替换所有的匹配。
'''
练习:
import re
phone = "2004-959-559 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.+', "", phone)
print("电话号码 : ", num)
# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print("电话号码 : ", num)

#以下实例中将字符串中的匹配的数字乘于2
def double(matched):
    value = int(matched.group('chengyu'))
    return str(value * 2)

s = 'A23G4HFD567'
print(re.sub('(?P<chengyu>\d+)', double, s))  #repl参数是一个函数
print(re.search(r"(?P<name>[a-z]{3})","chengyu31232ashhcv").group("name"))

'''
#compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用
当我们在Python中使用正则表达式的时候,re模块内会做两件事:
1.比编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
2.用编译后的正则表达式取匹配字符串
如果一个正则表达式重复调用很多次,出于对效率的考虑,我们可以预编译正则表达式,
这样接下来重复使用就不需要编译这一步了,可以直接使用
语法:
re.compile(pattern[, flags])
'''