在python中使用正则表达式
一、搜索和查找与正则相匹配的内容
1、re.compile的用法
compile(pattern, flags=0)把正则表达式编译为正则表达式对象
一个正则表达式的例子,从字符串string中找字符“the”出现的次数,不区分大小写:
#正则表达式与模式匹配
string="The quick brown fox jumps over the lazy dog."
string_list=string.split()
pattern=re.compile(r"The",re.I)
#re.compile函数将文本形式的模式编译成编译后的正则表达式(即正则表达式的编译)。
#r不是必须的,但是在正则表达式中使用原始字符串是一个好习惯
#re.I函数确保模式不区分大小写。
count=0
for word in string_list:
if pattern.search(word):
print(pattern.search(word).string)
count+=1
print("The出现的次数:{0:d}".format(count))
结果:
The
the
The出现的次数:2
2、re.search()
search(pattern, string, flags=0)返回第一个匹配到的对象,可以调用这个对象的 group()方法返回第一个匹配到的值。没有匹配上返回None。
查找第一次出现字母的对象:
#!/usr/bin/env python3 #正则表达式与模式匹配 import re res1 = re.search(r'[a-z]+', r'jiem098mib562qwe678') print('search', res1) print(res1.group())
结果:
search <re.Match object; span=(0, 4), match='jiem'> jiem
3、re.match()
match(pattern, string, flags=0)和search用法一样,唯一区别就是只在字符串开始匹配
使用re.match方法,查找以185开头的电话号码
#正则表达式与模式匹配
#re.match的使用
import re
string_list = string.split(';')
count = 1
for word in string_list:
ret = re.match(r"^185\d{8}$", word)
if ret:
print("第"+str(count)+"个位置可以匹配,匹配结果是:"+ ret.string)
else:
print("第"+str(count)+"个位置不能匹配")
count+=1
结果:
第1个位置可以匹配,匹配结果是:18512349553
第2个位置不能匹配
第3个位置不能匹配
第4个位置不能匹配
第5个位置可以匹配,匹配结果是:18511113141
4、re.findall()
findall(pattern, string, flags=0)所有的匹配结果都返回在一个列表中,如果没有匹配上就返回一个空列表.
使用re.findall的方法。
将数字取出:
#!/usr/bin/env python3 #正则表达式与模式匹配:re.findall import re string="a list of groups; this is not 123 and 456" res = re.findall(r'[0-9]+', string) print(res)
结果:
['123', '456']
5、finditer()
finditer(pattern, string, flags=0)根据正则表达式匹配字符串得到 一个迭代器,迭代器中每个元素都是一个对象,每个对象都可通过 group()方法获取对应的匹配值。(查找)
#!/usr/bin/env python3 #正则表达式与模式匹配 import re string="928jkh568isd123hde547vcx" res = re.finditer(r'\d+', string) print(res) for each in res: print(each)
结果:
<callable_iterator object at 0x000001D185AF8128> <re.Match object; span=(0, 3), match='928'> <re.Match object; span=(6, 9), match='568'> <re.Match object; span=(12, 15), match='123'> <re.Match object; span=(18, 21), match='547'>
二、切割和替换与正则相匹配的内容
1、sub()
sub(pattern, repl, string, count=0, flags=0)根据(pattern)正则表达式规则将匹配好的字符串替换为新字符串(repl),string为目标串,count可以指定替换次数
#!/usr/bin/env python3 #正则表达式与模式匹配 import re string="928jkh568isd123hde547vcx" res = re.sub(r'\D+', 'AAA',string) #\D匹配任何一个非数字字符 print(res)
结果:
928AAA568AAA123AAA547AAA
只替换前两次匹配的结果:
#!/usr/bin/env python3 #正则表达式与模式匹配 import re string="928jkh568isd123hde547vcx" res = re.sub(r'\D+', 'AAA',string,2) #\D匹配任何一个非数字字符 print(res)
结果:
928AAA568AAA123hde547vcx
2、subn()
subn(pattern, repl, string, count=0, flags=0)根据(pattern)正则表达式规则将匹配好的字符串替换为新字符串(repl),string为目标串,count可以指定替换次数.
返回的结果是元组,其中有替换结果和替换次数
#!/usr/bin/env python3 #正则表达式与模式匹配 import re string="928jkh568isd123hde547vcx" res = re.subn(r'\D+', 'AAA',string) #\D匹配任何一个非数字字符 print(res)
结果:
('928AAA568AAA123AAA547AAA', 4)
将匹配次数设置为3,则:
#!/usr/bin/env python3 #正则表达式与模式匹配 import re string="928jkh568isd123hde547vcx" res = re.subn(r'\D+', 'AAA',string,3) #\D匹配任何一个非数字字符 print(res)
结果:
('928AAA568AAA123AAA547vcx', 3)
3、split()
split(pattern, string, maxsplit=0, flags=0)按照正则表达式匹配好的字符串去切割目标字符串,匹配对的结果会先拿第一个结果切割目标串,
切割完后拿第二个结果切割这两个字符串,以此类推。可以指定最大切割次数,返回一个列表。
以数字分割该字符串:
#!/usr/bin/env python3 #正则表达式与模式匹配 import re string="928jkh568isd123hde547vcx" res = re.split(r'\d+', string) #\d匹配任何一个数字字符 print(res)
结果:
['', 'jkh', 'isd', 'hde', 'vcx']
最后展示一个这些函数应用的示例:
#!/usr/bin/env python3 #正则表达式与模式匹配 import re string="<a>我爱你</a><h1>我恨你</h1>" res1 = re.split(r'<[\/]?[a]>', string) #<[\/]?[a]>为匹配尖括号里的a或反斜杠a print(res1[1]) print("…………") res2 = re.finditer(r'<[\/]?[0-9a-z]+>', string) #<[\/]?[0-9a-z]+>为匹配尖括号里的字母数字或反斜杠的正则 for each in res2: print(each.group()) print("…………") res3 = re.findall(r'<[\/]?[0-9a-z]+>', string) print(res3) print("…………") res4 = re.search(r'<\w+>(?P<oo>\D+)</\w+><\w+>(?P<nn>\D+)</\w+>',string) print(res4.group('oo')) print(res4.group('nn')) print("…………") res5 = re.search(r'<(?P<tt>\w+)>(?P<cc>\w+)</\w+>', r'<a>hello</h1><a>hello</a>') print(res5.group('tt')) print(res5.group('cc')) print(res5.group())
结果:
我爱你 ………… <a> </a> <h1> </h1> ………… ['<a>', '</a>', '<h1>', '</h1>'] ………… 我爱你 我恨你 ………… a hello <a>hello</h1>
原文链接:https://www.cnblogs.com/xiao-xue-di/p/9438165.html