这四个方法是
从某个字符串中寻找特定子串
或
判断某个字符串是否符合某个模式
的常用方法。
1、match
re.match(pattern, string[, flags])
从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。
2、search
re.search(pattern, string[, flags])
若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个。
3、findall
re.findall(pattern, string[, flags])
返回string中所有与pattern相匹配的全部字串,返回形式为数组。
4、finditer
re.finditer(pattern, string[, flags])
返回string中所有与pattern相匹配的全部字串,返回形式为迭代器。
若匹配成功,match()/search()返回的是Match对象,finditer()返回的也是Match对象的迭代器,获取匹配结果需要调用Match对象的group()、groups或group(index)方法。
group()、groups()与group(index)的区别,如下所示:
>>> import re
>>> s = '23432werwre2342werwrew'
>>> p = r'(\d*)([a-zA-Z]*)'
>>> m = re.match(p,s)
>>> m.group()
'23432werwre'
>>> m.group(0)
'23432werwre'
>>> m.group(1)
'23432'
>>> m.group(2)
'werwre'
>>> m.groups()
('23432', 'werwre')
>>> m = re.findall(p,s)
[('23432', 'werwre'), ('2342', 'werwrew'), ('', '')]
>>> p=r'(\d+)'
>>> m=re.match(p,s)
>>> m.group()
'23432'
>>> m.group(0)
'23432'
>>> m.group(1)
'23432'
>>> m.groups()
('23432',)
>>> m=re.findall(p,s)
['23432', '2342']
综上:
-
group():母串中与模式pattern匹配的子串;
-
group(0):结果与group()一样;
-
groups():所有group组成的一个元组,group(1)是与patttern中第一个group匹配成功的子串,group(2)是第二个,依次类推,如果index超了边界,抛出IndexError;
-
findall():返回的就是所有groups的数组,就是group组成的元组的数组,母串中的这一撮组成一个元组,那一措组成一个元组,这些元组共同构成一个list,就是findall()的返回结果。另,如果groups是只有一个元素的元组,findall的返回结果是子串的list,而不是元组的list了。
s ="1113446777"
用正则表达式把s分为1111, 3, 44, 6, 777
>>> import re
>>> s='1113446777'
>>> m = re.findall(r'(\d)\1*',s)
>>> print m
['1', '3', '4', '6', '7']
>>> m = re.search(r'(\d)\*',s)
>>> m.group()
>>> m=re.search(r'(\d)\1*',s)
>>> m.group()
'111'
>>> m.groups()
('1',)
>>> m.group(0)
'111'
>>> m.group(1)
>>> m.group(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: no such group
>>> m=re.finditer(r'(\d)\1*',s)
>>> m.next().group()
'111'
>>> m.next().group()
>>> m.next().group()
>>> m.next().group()
>>> m.next().group()
'777'
>>> m.next().group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
另一个例子:
>>> p = r'(\d)\1+([a-zA-Z]+)'
>>> s = '1111werwrw3333rertert4444'
>>> p = r'(\d)\1+([a-zA-Z]*)'
>>> import re
>>> re.findall(p,s)
[('1', 'werwrw'), ('3', 'rertert'), ('4', '')]
>>> m = re.search(p,s)
>>> m.group()
'1111werwrw'
>>> m.group(1)
>>> m.group(2)
'werwrw'
>>> m.groups()
('1', 'werwrw')
>>> m = re.finditer(p,s)
>>> m.next().group()
'1111werwrw'
>>> m.next().group()
'3333rertert'
>>> m.next().group()
'4444'
>>> m.next().group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
1、matchre.match(pattern, string[, flags])从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。2、searchre.search(pattern, string[, flags])若string中包含pattern子串,则返回Match对象,否则
最近刚学习了
Python
3 的re模块,对正则表达式有了初步的了解,试着写了个代码发现正则表达式怎么一直不起作用。
结果发现是自己没搞清楚re.
match
()、re.
search
()和re.
findall
()的
区别
。
re.
match
() 总是从字符串“开头”去匹配,并返回匹配的字符串的
match
对象。所以当我用re.
match
()函数去匹配字符串非开头部分的字符串时,会返回NONE。
re.
match
只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.
search
匹配整个字符串,直到找到一个匹配,可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式语法:
re.
match
(pattern, string, flags=0)函数参数说明:
pattern 匹配的正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
二、re.
search
正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。(来自百度)
正则表达式语法
(图片资料转自https://www.cnblogs.com/chengege/p/11190782.html)
re模块是
python
中
内置的,支持正则匹配的模块。
match
方法
match
方法的语法为:re.
match
(pattern,string,[flags=0])
patter
python
的正则匹配如果看懂了,很有逻辑,还是比较好用的。但是如果不熟悉的话,感觉函数太多,难以区分。
match
和
search
是正则匹配
中
常用的两个函数。
在用之前我们首先想,如果我想找某字符串的头上有没有指定的某个字符串,我们该怎么办?
python
专门给我们提供了一个函数,它就是
match
。
match
只会匹配字符串头,如果字符串头有想要查找的模式,那就返回成功,如果没有那么就返回none。
python
正则模块re
中
findall
和find
iter
两者相似,但却有很大
区别
。
两者都可以获取所有的匹配结果,这和
search
方法有着很大的
区别
,同时不同的是一个返回list,一个返回一个
Match
Object类型的
iter
ator
假设我们有这样的数据:其
中
数字代表电话号,xx代表邮箱类型
content = '''email:12345678@163.com
email:2345678@163.com
email:345678@163.com
需求:(正则没有分组)提取所有的邮箱信息
result_find
iter
= re.find
iter
(r"\d+@\w+
本文实例讲述了
Python
3正则匹配re.split,re.find
iter
及re.
findall
函数用法。分享给大家供大家参考,具体如下:
re.split re.find
iter
re.
findall
@(
python
3)
官方 re 模块说明文档
re.compile() 函数
编译正则表达式模式,返回一个对象。可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率。
re 模块最离不开的就是 re.compile 函数。其他函数都依赖于 compile 创建的 正则表达式对象
re.compile(pattern, flags=0)
pattern 指定编译时的表达式字
Python
中
re模块的几个常用函数
match
()函数
match
()函数试图从字符串的起始部分对模式进行匹配。如果匹配成功则返回
Match
Object对象实例,如果不是起始位置匹配成功的话,就返回None。
search
()函数
re.
search
()函数扫描整个字符串并返回第一个成功的匹配,匹配成功re.
search
方法返回
Match
Object对象的实例,否则返回None。
compile()函数
re.compile()函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,供
match
1. 测试正则表达式的工具。
在线正则表达式测试: http://tool.oschina.net/regex/
2. 常见的匹配模式3. 常用的匹配方法3.1. re.
match
re.
match
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,
match
()就会返回none
最常规的匹配
import re
content = "Hello 123 4567 World_Thi
相比其他方法,
findall
方法有些特殊。它的作用是查找字符串
中
所有能匹配的字符串,并以结果存于列表
中
,然后返回该列表
注意:
match
和
search
是匹配一次
findall
匹配所有。
1 pattern.
findall
方法
该方法的作用是在string[pos, endpos]区间从pos下标处开始查找所有满足pattern的子串, 直到endpos位置结...
pat=re.compile('(生产|产量|销量).*?[升吨]')
res=pat.search('我国啤酒行业年产量就进入了下滑通道,2019年全国规模以上啤酒企业累计销量3765.3万千吨生,较2018年的3812.2万千升下降1.23%')
[/code]
这个findall找不到,但是search就可以搜到。这是为什么呢?
编写systemd service文件
挑战自己~:
基于Bootstrap的switch button
heiPony:
Linux进程状态:D
weixin_43956160: