Python 正则表达式

自己总结的一些常用的正则表达式的方法
正则表达式教程

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值