Python正则表达式学习笔记

import re

正则表达式方法

re.findall()方法

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表。
如果没有找到匹配的,则返回空列表。

m = re.findall('abc', 'abcdefgabc')
m
['abc', 'abc']

re.compile()方法

用于编译正则表达式,生成一个正则表达式(Pattern)对象

p = re.compile('^abc')  #以abc开头的字符串
m = p.findall('abc\nabc')
print(m)
m = p.findall('dabc\nabc')
print(m)
['abc']
[]

re.match()方法

从字符串的起始位置匹配一个正则表达式,
如果不是起始位置匹配成功的话,match()就返回none。
默认只匹配一次。

m = re.match('abc', 'abcabc').span()  #span()方法返回匹配到的对象的跨度,类型为元组
print(m)
m = re.match('abc', 'babcabc')
print(m)
(0, 3)
None

re.search()方法

扫描整个字符串并返回第一个成功的匹配。

m = re.search('abc', 'abcabc').span()
print(m)
m = re.search('abc', 'babcabc').span()
print(m)
(0, 3)
(1, 4)

re.sub()方法

用于替换字符串中的匹配项。
re.sub(pattern, repl, string, count=0, flags=0)
参数:
pattern:正则中的模式字符串。
repl:替换的字符串,也可为一个函数。
string:要被查找替换的原始字符串。
count:模式匹配后替换的最大次数,默认0表示替换所有的匹配。
flags:编译时用的匹配模式,数字形式。
前三个必选,后两个可选。

phone = "2004-959-559 # 这是一个电话号码"

# 删除注释
num = re.sub(r'#.*$', "", phone)
print("电话号码 : ", num)

# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print("电话号码 : ", num)
电话号码 :  2004-959-559 
电话号码 :  2004959559

re.finditer()方法

和 findall 类似,
在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

it = re.finditer(r"\d+", "12a32bc43jf3")
for match in it:
    print(match.group())
12
32
43
3

re.split()方法

按照正则表达式将字符串分割后返回列表,
对于一个找不到匹配的字符串而言,split 不会对其作出分割,
会返回以原字符串为单个元素的列表。
maxsplit参数表示分割次数,默认值为0,表示不限制次数。

m = re.split(' ', 'hello world')
m
['hello', 'world']
m = re.split('abc', 'hello world')
m
['hello world']

正则表达式对象及其方法

re.RegexObject对象

即正则表达式对象,re.compile()方法返回此对象。

re.MatchObject对象

即匹配对象,re.match()方法返回此对象。

m = re.match(r'(abc) (defg)', 'abc defg hijkl')

print('m:', m)

#groups():等价于(group(1),group(2),...)
print('m.groups():', m.groups())

#group()/group(0):返回被正则表达式所匹配的字符串。
print('m.group():', m.group())
print('m.group(0):', m.group(0))

#span()/span(0):返回一个元组包含匹配 (开始,结束) 的位置。
print('m.span():', m.span())
print('m.span(0):', m.span(0))

#start()/start(0):返回匹配开始的位置。
print('m.start():', m.start())
print('m.start(0):', m.start(0))

#end()/end(0):返回匹配结束的位置。
print('m.end():', m.end())
print('m.end(0):', m.end(0))

#group(n):返回第n个子串。
print('m.group(1):', m.group(1))

#start(n):返回第n个子串开始的位置。
print('m.start(1):', m.start(1))

#end(n):返回第n个子串结束的位置。
print('m.end(1):', m.end(1))

#sapn(n):返回第n个子串结束的位置。
print('m.span(1):', m.span(1))

print('m.group(2):', m.group(2))
print('m.span(2):', m.span(2))
try:
    print(m.group(3))
except:
    print('m.group(3) is not exist.')
m: <re.Match object; span=(0, 8), match='abc defg'>
m.groups(): ('abc', 'defg')
m.group(): abc defg
m.group(0): abc defg
m.span(): (0, 8)
m.span(0): (0, 8)
m.start(): 0
m.start(0): 0
m.end(): 8
m.end(0): 8
m.group(1): abc
m.start(1): 0
m.end(1): 3
m.span(1): (0, 3)
m.group(2): defg
m.span(2): (4, 8)
m.group(3) is not exist.

正则表达式模式

'[…]'匹配集合中任意一个字符

m = re.findall('a[bcd]e', 'abe ace ade afe')
m
['abe', 'ace', 'ade']

'[^…]'匹配不在集合中的任意一个字符

m = re.findall('a[^bcd]e', 'abe ace ade afe')
m
['afe']

'^re’匹配开头

m = re.findall('^abc', 'abcdabc')
m
['abc']

're$'匹配结尾

m = re.findall('abc$', 'abcabc')
m
['abc']

're?'匹配1个或0个

m = re.findall('ab?', 'aababb')
m
['a', 'ab', 'ab']

're+'匹配至少1个

m = re.findall('ab+', 'aababb')
m
['ab', 'abb']

're*'匹配至少0个

m = re.findall('ab*', 'aababb')
m
['a', 'ab', 'abb']

'+特殊字符’转义字符

也可以通过原始字符串来表示含有转义字符串的re

#r'\t',等价于\\t
m = re.findall('\\t', 'a\tc')
m
m = re.findall(r'\t', 'a\tc')
m
['\t']

're{n}'匹配n个,只能是n个,多一个少一个都不行

m = re.findall('o{2}', 'food')
m
['oo']
m = re.findall('o{2}', 'dog')  #少一个不行
m
[]
m = re.findall('o{2}', 'ooomg')  #多一个不行
m
['oo']

're{n,}'匹配n个以上,少于n个匹配不了

re{0,}等价于re*
re{1,}等价于re+

m = re.findall('o{2,}', 'ooomg')  #上一例中'o{2}'无法匹配'ooomg'
m
['ooo']
m = re.findall('o{2,}', 'dog')
m
[]

'a|b’匹配a或b

m = re.findall('a|b', 'abcabcabc')
m
['a', 'b', 'a', 'b', 'a', 'b']

'(re)'匹配括号中的正则表达式,也表示一个组

m = re.match('([0-9]{0,})([A-Z]{0,})', '1234567ABCDEFG')
m.groups()
('1234567', 'ABCDEFG')

'(#.*$)'匹配注释

s = 'l = [i for i in range(10)]  #生成一个0-9的列表'
m = re.findall('#.*$', s)
m
['#生成一个0-9的列表']

特殊字符类

‘.‘匹配除了换行符(’\n’)之外的所有字符

m = re.findall('.', 'aa\nbb')
m
['a', 'a', 'b', 'b']

'\d’数字,等价于[0-9]

m = re.findall('\d', 'ab12c3')
m
['1', '2', '3']

'\D’非数字,等价于[^0-9]

m = re.findall('\D', 'ab你好12c3')
m
['a', 'b', '你', '好', 'c']

'\s’空白字符(打印出来为空白的字符),等价于[\f\n\r\t\v]

m = re.findall('\s', 'ab \t12c3')
m
[' ', '\t']

'\S’非空白字符,等价于[^\f\n\r\t\v]

m = re.findall('\S', 'ab \t12c3')
m
['a', 'b', '1', '2', 'c', '3']

'\w’数字,字母和下划线(),等价于[A-Za-z0-9]

m = re.findall('\w', 'ab12c3')
m
['a', 'b', '1', '2', 'c', '3']

'\W’非数字,字母,下划线(),等价于[^A-Za-z0-9]

m = re.findall('\W', 'ab##$12c3')
m
['#', '#', '$']

'[\u4e00-\u9fa5]'匹配汉字

m = re.findall('[\u4e00-\u9fa5]', 'a你b好c')
m
['你', '好']

'\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\uff01’匹配中文标点符号

m = re.findall(
    '[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\uff01]',
    '。;,:“”()、?《》!')
m
['。', ';', ',', ':', '“', '”', '(', ')', '、', '?', '《', '》', '!']

正则表达式修饰符(flag参数)

're.I’不区分大小写

m = re.findall('abc', 'abcaBc', re.I)
m
['abc', 'aBc']

‘re.S’使’.'匹配包括换行(\n)在内的所有字符

s = '<div>hello\nworld</div>'
m = re.findall(r'<div>(.*)</div>', s, re.S)
m
['hello\nworld']

're.M’匹配多行,影响匹配开头(^)和匹配结尾($)

m = re.findall('^abc', 'abc\nabc')  #没加“re.M”就只匹配一行
print(m)
m = re.findall('^abc', 'abc\nabc', re.M)
print(m)
['abc']
['abc', 'abc']

同时使用多个修饰符,通过逻辑或(|)来连接多个修饰符

#匹配换行并且不区分大小写
s = '<diV>hello\nworld</DIV>'
m = re.findall(r'<div>(.*)</div>', s, re.S | re.I)
m
['hello\nworld']

贪婪模式与非贪婪模式

贪婪模式:正则表达式会尽可能的匹配最大长度的字符串
非贪婪模式:正则表达式匹配到一个符合要求的字符串就停止,不往下继续匹配了
默认是贪婪模式,在匹配的量词后面加一个 ? 就可以变为非贪婪模式

#贪婪模式
m = re.findall('a.*c', 'abcbbbc')
m
['abcbbbc']
#非贪婪模式
m = re.findall('a.*?c', 'abcbbbc')
m
['abc']
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值