[Daily]永远学不会的正则表达式

正则表达式是很强大的用来处理字符串的工具。

引用模块

import re

模块里面几个重要的函数

1.re.compile(pattern, flags)

第一个参数是正则表达式,第二个参数是表示匹配模式,比如re.I(I是IGNORECASE的缩写也就是忽略大小写)

将正则表达式编译成Pattern对象,主要供search和match这两个函数使用。

这函数

pattern = re.compile(r'hello')
print(type(pattern))

#输出如下
>>> <class '_sre.SRE_Pattern'>

2.re.match(pattern, str, flags)

第一个参数是匹配模式 第二个是字符串,第三个是模式,默认为0

这个函数是从所给的字符串里从第一个字符开始寻找一个匹配的字符串,如果第一个字符就匹配不上的话就算匹配不到。

str1 = 'hello world'
str2 = 'hahahello world'
pattern = re.compile(r'hello')
res1 = re.match(pattern, str1)
res2 = re.match(pattern, str2)

print(res1)
print(res1.group())

print(res2)
print(res2.group())

#输出如下
>>> <_sre.SRE_Match object; span=(0, 5), match='hello'>
>>> hello
>>> None
#最后一个报错,因为 'NoneType' object has no attribute 'group'

3.re.search(pattern, string, flags)

search与match的区别就在于match一定要从字符串第一个字符开始匹配,但search不用,也就是search是查找任意位置匹配的字符串。

4.re.findall(pattern, string, flags)

findall是以列表形式返回所有可以匹配的字符串,从string的任意位置开始匹配,并返回一个匹配列表。

5.re.finditer(pattern, string, flags)

finditer作用和findall一样,只是findall返回一个列表,而finditer返回一个迭代器。

pattern = re.compile('\w+')
s = "aszhu....hxew8639721jak3;[]"
a = pattern.findall(s)
b = pattern.finditer(s)
print(a)
print(b)

#输出如下
>>> ['aszhu', 'hxew8639721jak3']
>>> <callable_iterator object at 0x000001CB14EDA5C0>

6.re.split(pattern, string, maxsplit, flags) 

用pattern分开字符串,maxsplit表示最多分割次数。

pattern = re.compile(',')
s = "我的天,哈哈哈哈哈,笑死了,*_*"
z = pattern.split(s)
print(z)

#输出如下
>>> ['我的天', '哈哈哈哈哈', '笑死了', '*_*']

7.re.sub(pattern, repl, string, count, flags) 

这是替换函数,将在string中匹配到的用repl进行替换,count代表最大替换次数,flags表示模式。

pattern = re.compile('[a-z]+')
s = "我的天,hahahaha,笑死了,*_*"
z = pattern.sub("嘻嘻",s)
print(z)

#输出如下
>>> 我的天,嘻嘻,笑死了,*_*

模块里面的分组用法

group()

不加参数默认返回所有匹配的对象。

当括号里加入数字参数的时候,就返回当前参数所在位置的对象。

【顺便start / end / span 的用法一起提了】

pattern = re.compile('([^,]+),([^,]+),([^,]+),([^,]+)')
s = "我的天,哈哈哈哈哈,笑死了,*_*"
z = pattern.search(s)
#返回整个匹配的字符串
print("group:" + z.group())
#返回第二个匹配的元组
print("group2:" + str(z.group(2)))
#返回第三个到第四个匹配的元组
print("group3-4:" + str(z.group(3, 4)))
#返回匹配字符串的起始位置
print("start:" + str(z.start()))
#返回匹配字符串的结束位置
print("end:" + str(z.end()))
#返回匹配字符串的范围
print("span:" + str(z.span()))

#输出如下 
>>> group:我的天,哈哈哈哈哈,笑死了
>>> group2:哈哈哈哈哈
>>> group3-4:('笑死了', '*_*')
>>> start:0
>>> end:17
>>> span:(0, 17)

group()除了能加数字的参数之外,还能加字符串的参数即利用别名访问分组。

前提是得用到使用了(?P<name>)的语法。

str = 'MAYDAY is everyday'
x = re.compile("(?P<name>\w+)\s\w+\s(\w+)")
print(x.search(str).group('name'))

#输出如下
>>> MAYDAY

模块里一些常用的匹配模式

1. IGNORECASE

简写为re.I  =>  忽视大小写

2. ASCII

简写为re.A  =>  让 \w, \W\b\B\d\D\s 和 \S 只匹配ASCII,而不是Unicode。

3. DOTALL

简写为re.S  =>  dot表示. all表示所有即.匹配所有包括换行符\n,默认情况下,.是不匹配换行符的。

4. MULTILINE

简写为 re.M  =>  多行模式,当某字符串中有换行符\n,默认模式下是不支持换行符特性的,比如:行开头 和 行结尾,而多行模式下是支持匹配行开头的。

5. VERBOSE

简写为 re.X  =>   详细模式,可以在正则表达式中加注解。

正则表达式的一些语法

20191230151520681.jpg

图源python使用正则表达式(Regular Expression)方法超详细

参考:python 正则表达式详解

           Python正则表达式,这一篇就够了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值