PYTHON 之 正则表达式RE

RE使用的大概步骤

  1. 使用compile将表示正则的字符串编译为pattern对象
  2. 通过pattern对象提供一系列方法对文本进行查找匹配,获得匹配结果,一个match对象
  3. 最后使用match对象提供的的属性和方法获得信息,根据需要进行操作

RE常用函数

  • group() 获得一个或者多个匹配的字符串,当获得整个匹配的子串时,直接使用group获得group(0)
  • start:获得分组匹配的子串在整个字符串中的起始位置,参数默认为0
  • end:获得分组匹配的子串在整个字符串中的结束位置,参数默认为0
  • span:返回的结构技术(start(group),end(group))
#导入相关包
import re

#查找数字
#r表示字符串不转义
p = re.compile(r'\d+')

#在字符串“onetwothree123fourfivesix45678”查找
#返回结果“none"表示没找到,否则返回匹配jieguo

m = p.match("one123twothree123fourfivesix45678",3,20)
#m = re.findall(r"\d+","onetwothree123fourfivesix45678")

#m = p.match("onetwothree123fourfivesix45678")

print(m)

输出:
<re.Match object; span=(3, 6), match=‘123’>

string = '刘德华 Andy Lau'
pattern = '.*?\s'
s = re.match(pattern=pattern,string=string)
print(s.group())

输出:
刘德华

RE compile 和match函数

  • compile
  • match :从序号0开始查找匹配的字符,如果不匹配,即使后面有匹配的内容,仍然返回NONE
#导入相关包
import re

#查找数字
#r表示字符串不转义
p = re.compile(r'\d+')

#在字符串“onetwothree123fourfivesix45678”查找
#返回结果“none"表示没找到,否则返回匹配jieguo

m = p.match("onetwothree123fourfivesix45678",3,15)

print(m)

# match可以输入参数,表示起始位置和终结位置
# match只能有一个,返回查找到的第一个内容
m = p.match("onetwothree123fourfivesix45678",11)
help(p.match)

输出:
None
Help on built-in function match:

match(string, pos=0, endpos=9223372036854775807) method of re.Pattern instance
Matches zero or more characters at the beginning of the string.

print(m[0])
print(m.start(0))#查找到的对象起始下标序号
print(m.end(0))#查找到的对象结束下标序号

输出:
123
11
14

import re

#re.I表示忽略掉大小写
p = re.compile(r'([a-z]+) ([a-z]+)',re.I)

m = p.match('I really love wang xiao jing')
print(m)

输出:
<re.Match object; span=(0, 8), match=‘I really’>

print(m.group(0))#表示返回结果

print(m.group(1))#表示第一个匹配项
print(m.group(2))#表示第二个匹配项

print(m.group(3))#该项没有,返回no such group

输出
I really
I
really

IndexError Traceback (most recent call last)
in
4 print(m.group(2))#表示第二个匹配项
5
----> 6 print(m.group(3))#该项没有,返回no such group

IndexError: no such group

#表示 group 0 的起始序号和结束序号
print(m.start(0))
print(m.end(0))
print('*'*20)

#表示 group 1 的起始序号和结束序号
print(m.start(1))
print(m.end(1))
print('*'*20)

#表示 group 2 的起始序号和结束序号
print(m.start(2))
print(m.end(2))

输出
0
8


0
1


2
8

print(m.group())#返回group(0)的结果
print('*'*30)
print(m.groups())#返回全部的group结果

输出
print(m.group())#返回group(0)的结果
print(’*’*30)
print(m.groups())#返回全部的group结果

查找

  • search(str,[pos,[endpos]]):在字符串查找匹配,pos和endpos表示起始位置和结束位置
  • findall:查找所有
  • finditer:查找,返回一个可iter的结果
#导入相关包
import re

#查找数字
#r表示字符串不转义
p = re.compile(r'\d+')


#返回结果“none"表示没找到,否则返回匹配jieguo

m = p.search("one123twothree123fourfivesix45678")

print(m.group())

输出
123

rst = p.findall("one123twothree123fourfivesix45678")
print(type(rst))
print(rst)

输出
<class ‘list’>
[‘123’, ‘123’, ‘45678’]

SUB替换

  • sub(repr,str[,count])
#sub 替换案例

p = re.compile(r'(\w+) (\w+)')

s = "hel 123 i 12 a b c d 123"

rst = p.sub('hello world',s)

print(rst)

输出
hello world hello world hello world hello world 123

匹配中文

  • 大部分中文表示范围:[u4e00-u9fa5],不包括全角标点
import re

title = u'世a 界 您好 a bcsd'

p = re.compile(r'[\u4e00-\u9fa5]+')

rst = p.findall(title)

print(rst)

输出
[‘世’, ‘界’, ‘您好’]

贪婪和非贪婪

  • 贪婪表示尽可能多的匹配,使用(*)表示
  • 非贪婪表示找到符合条件的内容即可,使用(?)表示
  • 正则默认是贪婪的
import re

title = u'<div>name</div> <div>age</div>'

p1 = re.compile(r'<div>.*</div>')
p2 = re.compile(r'<div>.*?</div>')

rst1 = p1.search(title)
rst2 = p2.search(title)

print(rst1)
print(rst2)
print('*'*80)
print(rst1.group(0))
print(rst2.group(0))

输出
<re.Match object; span=(0, 30), match= ‘

name
age
’>
<re.Match object; span=(0, 15), match=‘
name
’>


name
age
name
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值