自己总结的一些常用的正则表达式的方法
正则表达式教程
1. re.match() 的用法
# -*- coding:utf-8 -*-
import re
pattern = r"(\w+) (\w+)"
match = re.match(pattern,"I love YOu")
if match: # 字符串只要不是 None 就想当于True
print(match) # <_sre.SRE_Match object; span=(0, 6), match='I love'>
print(match.group(0)) # 0 : 表示最大的分组
print(match.group(1)) # 1 :表示第一分组
print(match.group(2))
print(match.group(0,1,2)) # 可以同时返回多个分组,封装到 tuple 里面
print(match.start(1),match.end(1)) # start - end : 返回组的起始位置
print(match.start(2),match.end(2))
print(match.span(1)) # span : 返回第一组的起始地址,将起始地址封装到tuple 里面
else:
print("none")
测试结果:
<_sre.SRE_Match object; span=(0, 6), match='I love'>
I love
I
love
('I love', 'I', 'love')
0 1
2 6
(0, 1)
(2, 6)
2. 预编译形式
# -*- coding:utf-8 -*-
import re
pattern = r"(\w+) (\w+)"
s = "Hello world"
match = re.search(pattern,s) # <_sre.SRE_Match object; span=(0, 11), match='Hello world'> 返回的是 match 对象,其常用方法如上
print(match)
resule = match = re.findall(pattern,s) # [('Hello', 'world')] 在一个list 里面包含 tuple
print(resule)
regex = re.compile("[a-z]+") # 采用预编译的形式
print(regex) # re.compile('[a-z]+')
print( type(regex) ) # <class '_sre.SRE_Pattern'> , 返回的是 Pattern 对象
match = regex.match("hello ") # 因为已经有了正则表达式,所以不需要再 match() 方法中传入Pattern ,否则报错
print(match) # 返回的是 match 对象
# regex.findall(string)
# regex.match(string)
# regex.split(string)
3. 贪婪与非贪婪
s = "<html><title>hello</title></html>"
p1 = r"<(.+)>" # 非贪婪: <_sre.SRE_Match object; span=(0, 33), match='<html><title>hello</title></html>'>
p2 = r"<(.+?)>" # 贪婪 : <_sre.SRE_Match object; span=(0, 6), match='<html>'>
# 贪婪是指: 在找到之后,继续往下找,找到找到满足条件最长的字符串,re 模块,默认是采用贪婪
# 非贪婪: 找到之后就停止往下找
print( re.match(p2,s))
4.测试方法
import re
def test01():
s = "<span jfda> <em>23</em> </span>"
pattern = "<em>23</em>"
res = re.match(pattern=pattern,string=s)
print(res)
res = re.compile(pattern,re.IGNORECASE) # None
print( res.findall(s) ) # ['<em>23</em>']
def test02():
# findall() 方法
pattern = re.compile(r"\d+") # "\\d+" , "r"\d" 作用都是一样的
res = pattern.findall("jf34jfda342d") # 返回 list
print(res) # ['34', '342']
def test03():
# split()
s = "fda343dsaf343fdj"
pattern = re.compile(r"\d+")
reslist = pattern.split(s) # 表示按照数字切割
print(reslist) # ['fda', 'dsaf', 'fdj']
def test04():
# 分组
s = "tom34jeck11rose33"
pat = "^tom.+33$" # 表示去匹配 以 tom 开头, 33结尾的字符串
m = re.match(pattern=pat,string=s)
print(m)
print(m.group())
print(m.groups())
def testSearch():
# search()
s = "tom34jeck11rose33"
pat = r"\d+"
pattern = re.compile(pattern=pat)
m = pattern.search(s) # 拿到匹配的字符串 ,找到即返回
print(m.group(0)) # 34 , 拿到找到的字符串
'''
search() : 方法用于找到第一个匹配的结果 , 找到即返回
findall(): 找到所有匹配的结果,并将所有匹配返回
Matcher 对象:表示你全局匹配 ,正则表达式需要匹配整个字符串,然后通过分组,拿出需要取的数据
pat = "^tom.+33$" # 表示去匹配 以 tom 开头, 33结尾的字符串
m = re.match(pattern=pat,string=s)
'''
def testGreedy():
# 贪婪 与 非贪婪
s = '<html><input>fdj</input></html>'
patstr = "<.*?>"
patstr2 = "<.*>"
pattern = re.compile(s)
print(re.match(patstr,s))
print(re.match(patstr2,s))
5.替换字符串
5.1 删除字符串
def test02():
pattern = r"\d+"
text = "abc 234 jeck 45"
text = re.sub(pattern,'',text) # 删除掉数字
print(text) # abc jeck
5.2 操作分组
- 取分组,在分组前后加上字符串
- 替换的字符串必须是用 ‘r’ 转义的
def test03():
# 取分组的信息
pattern = r"(\d+)"
text = "abc 234 jeck 45"
text = re.sub(pattern,r'@\1',text) # 在每个数字前面加上 @ 符号,这里需要用 'r'转义才行
print(text) # abc @234 jeck @45