课程Python3入门与进阶——“正则表达式”知识点。

re.findall

re.findall(pattern,string,flags=0)

前面为正则表达式,后面为要检索的字符串,返回一个列表(如果检索到值多次出现,则该列表含有多个相同值)。
第三个参数为匹配模式,默认匹配模式为0。re.I表示忽略大小写,re.S表示‘.’可以匹配一切字符。模式之间可以并存,用‘|’来分隔。例如re.findall(regular_expression,str,re.I | re.S)

a='Python\C\Java'
b='Python'
print(re.findall(b,a))
['Python']

a='PYH\n\n\n'
b='pyh...'
r=re.findall(b,a,re.I | re.S)
print(r)
['PYH\n\n\n']

a='PYH\n\n\n'
b='pyh...'
r=re.findall(b,a,re.I)
print(r)
[]

.
.
.

正则表达式的灵魂在于它的规则

.
.
.

正则表达式 代表的匹配字符
[0-9] 0123456789任意之一
[a-z] 小写字母任意之一
[A-Z] 大写字母任意之一
\d 等同于[0-9]
\D 等同于[^0-9]匹配非数字
\w 等同于[a-z0-9A-Z_]匹配大小写字母、数字和下划线
\W 等同于[^a-z0-9A-Z_]等同于上一条取非
\s 空白字符,例如\t,\n
. 除换行符\n之外其他所有字符

.
.
.

‘python’为普通字符,’\d’为元字符。

.
.
.

import re
a='abc,acc,auc,akc,ahc'
r=re.findall('a[ch]c',a)
print(r)
['acc', 'ahc']

普通字符常用于定界。中括号里面的字符为 ‘或 ’的关系。
.
.
.

[^]表示取反,‘非’。

.
.
.

import re
a='abc,acc,auc,akc,ahc'
r=re.findall('a[b-h]c',a)#一个范围
print(r)
['abc', 'acc', 'ahc']

.
.
.

数量词的表示

* 匹配前一个字符0次至无限次
+ 匹配前一个字符1次至无限次
匹配前一个字符0次或1次
{number1,number2} 匹配前一个字符number1至number2次(默认贪婪)
() 一个括号括起来的内容表示一组,字符之间为‘且’的关系,要全部出现
[] 一个中括号括起来,里面的字符之间为‘或’的关系 ,出现一个就行

.
.
.

?前面是范围时表示非贪婪,前面是字符时作为数量词

a='abcdef'
r=re.findall('[a-z]{2,4}',a)
print(r)
r=re.findall('[a-z]{2,4}?',a)
print(r)
['abcd', 'ef']
['ab', 'cd', 'ef']

.
.
.

^ 表示字符串的开始,从字符串的开头向后进行匹配
$ 表示字符串的末尾,从字符串的末尾往前进行匹配

.
.
.

re.sub

re.sub(pattern, repl, string, count=0, flags=0)
返回修改后的字符串。
count表示“最大的替换次数”,0表示无限多次。
flags为匹配模式。
repl可以是一个字符串,也可以是一个函数。
若是一个函数,则传入该函数的是一个对象。

str='i am a boy'
pattern='boy'
new_str=re.sub(pattern,'girl',str)
print(new_str)
i am a girl

<re.Match object; span=(7, 10), match='boy'>#span为匹配到的字符串的第一个字符的序号和最后一个字符的序号加一(类似于切片),match是匹配到的字符串。该函数如果不返回一个值,则源字符串对应的位置会被清空;若返回一个值,该值将替代匹配到的字符串。

def function(value):
	return 'girlll'
str='i am a boy'
pattern='boy'
new_str=re.sub(pattern,function,str)
print(new_str)
i am a girlll


group()方法可以提出截获的字符串

str.replace

str.replace(old, new[, count])

返回字符串的副本,其中出现的所有子字符串 old 都将被替换为 new。 如果给出了可选参数 count,则只替换前 count 次出现。
性能比re.sub弱很多,只能实现简单的字符串的替换,不能使用正则表达式
.
.
.

re.match

re.match(pattern, string, flags=0)

如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。

注意即便是 MULTILINE 多行模式, re.match() 也只匹配字符串的开始位置,而不匹配每行开始。

如果你想定位 string 的任何位置,使用 search() 来替代(也可参考 search() vs. match() )
也就是说,它只匹配字符串的开头。只匹配一次。

re.search

re.search(pattern, string, flags=0)

扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的。
也就是说,它遍历整个字符串。只匹配一次。

re.serch和re.match都只匹配一次,不同于re.findall会把所有的都找出来。前两者返回一个对象,后者返回一个列表。flags都是匹配模式。
.
.
.
在这里插入图片描述
.
.
.

Match.group()

一:概念
在这里插入图片描述
在这里插入图片描述二:
search和findall的一个小比较

import re
string='life is short ,and i will not be sad.'
pattern='life(.*)sad'
r=re.search(pattern,string)
print(r.group(1))

 is short ,and i will not be
string='life is short ,and i will not be sad.'
pattern='life(.*)sad'
r=re.findall(pattern,string)
print(r)
[' is short ,and i will not be ']

三:group()的分组

import re
string='life is short ,and i will not be sad,and i am happy now'
pattern='life(.*)sad(.*)now'
r=re.search(pattern,string)
print(r.group(0))
print(r.group(1))
print(r.group(2))
print(r.group(0,1,2))

life is short ,and i will not be sad,and i am happy now
 is short ,and i will not be
,and i am happy
('life is short ,and i will not be sad,and i am happy now', ' is short ,and i will not be ', ',and i am happy ')

0表示全部返回,1表示第一个分组,2表示第二个…如果有多个分组,就返回一个元组。
.
.
.

Match=groups()

在这里插入图片描述
和group()不同,它只返回所有匹配的子组,没有匹配到的就返回一个None,我们可以修改这个None的表示。

.
.
.
我是热爱编程的小云同学,有问题一起交流哦~~~~~~

发布了46 篇原创文章 · 获赞 9 · 访问量 923

猜你喜欢

转载自blog.csdn.net/weixin_45850939/article/details/104390390