一级棒!这应该是最好的 “re正则表达式” 使用教程了!(二)

简介: 一级棒!这应该是最好的 “re正则表达式” 使用教程了!(二)

③ findall(pattern, repl, string, count=0, flags=0)

findall()函数语法格式如下:


pattern:你写的正则表达式;

string:待匹配的字符串;

flag:修饰符;

findall()函数,不管是我们做爬虫,还是我们做数据清洗,都属于高频函数,大家一定要好好掌握。


我们先看一个简单的例子:


还是前面的字符串s1,我们分别只想获取a、只想获取b、获取a或b,使用findall()会出现什么结果呢?


s1 = 'ab黄cd同abc学'
re.findall('a',s1)
re.findall('b',s1)
re.findall('[a | b]',s1)


结果如下:

image.png

可以发现:finadll()函数会直接返回所有匹配对象,组成的列表(记住:返回的是列表),不像search()函数与match()函数,还需要调用group()函数,这个大家一定要注意。


如果finadll()函数,没有匹配上,不会报错,而是返回一个空列表。


s1 = 'ab黄cd同abc学'
re.findall('f',s1)


结果如下:

image.png

我们在来看一个稍微复杂一点的案例(爬虫经常见到的)


html = '''<html>
<head lang="en">
<title>Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
   <div id="content">
       <ul id="ul1">
           <li>first</li>
           <li>second</li>
           <li>third</li>
       </ul>
       <ul id="ul2">
           <li>alpha</li>
           <li>beta</li>
       </ul>
    </div>
    <div id="url">
        <a href="http:www.baidu.com" title="baidu">baidu</a>
        <a href="http:www.tipdm.com" title="tipdm">tipdm</a>
    </div>
</body>
</html>
'''


如果我们想要使用正则表达式,获取其中的li标签,或者获取其中的href属性,应该怎么做呢?


# 获取li标签
re.findall('<li>(.*?)</li>',html)
# 获取href属性
re.findall('<a href="(.*?)" ',html)


结果如下:

image.png

操作其实很简单,固定写法:首尾照抄字符串源代码,我们想要的东西使用()小括号,括起来,里面写上 .*?


上面提到了一个.*与.*?,其中.*表示贪婪匹配,.*?表示非贪婪匹配。


. 可以匹配除了换行符以外的所有字符;

*表示匹配前面的字符无限次;

?前面紧挨的元素,最多匹配一次;

我们用一个例子简单说明:


s2 = 'a123b456b789b3'
re.findall('a(.*)3',s2)
re.findall('a(.*?)3',s2)


结果如下:

image.png

用一句通俗的话说明它们的区别:贪婪匹配是尽可能多的匹配内容,非贪婪匹配是尽可能少的 匹配内容。字符串s2中有两个3,贪婪匹配会一直匹配到最后一个3,但是非贪婪匹配找到第一个3后,就停止了。


④ compile()

compile函数将字符串编译成正则表达式对象,供 match() 、 search() 和findall()函数使用。


即:先定义一个正则表达式对象(Pattern对象),然后分别调用该对象的match() 、 search() 和findall()函数,这三个函数用法与它们原本用法相同。


我们直接用一个例子讲述该函数:


type(re.compile(r'\d+'))


结果如下:

image.png

可以看到这是一个Pattern对象。


s3 = '12one34two56three78four'
# 定义一个正则表达式对象,用于匹配至少一个数字
pattern = re.compile(r'\d+') 
# 扫描整个字符串,匹配s3字符串中,符合该正则表达式的字符串。(这里调用的是对象的findll()对象)。
pattern.findall(s3)
# 从s3字符串,下标为1的位置,查找匹配值。
pattern.findall(s3,1)
# 从s3字符串,下标为1到下标为6的位置之间,查找匹配值。
pattern.findall(s3,1,6)


结果如下:

image.png


⑤ sub(pattern, repl, string, count, flags)

sub()函数是Python正则表达式中,专门用于“替换”的函数。


sub()函数语法格式如下:


pattern:你写的正则表达式;

repl:替换成啥;

string:待替换的字符串;

count:表示最大替换次数,默认 0 表示替换所有的匹配;

flag:修饰符;

同样对于上述提到的字符串s3,我们将“英文字母” 全部替换为 “字母”两个字,应该做么办呢?


# '\D{3,5}'表示匹配非数字3-5次。
s3 = '12one34two56three78four'
# 这里没有指定最大匹配次数,因此默认会替换所有的匹配值
re.sub('\D{3,5}','字母',s3)
# 这里指定最大匹配次数count=2,因此只会替换前2个匹配值
re.sub('\D{3,5}','字母',s3,2)
# 如果count=3,则会替换3个匹配值
re.sub('\D{3,5}','字母',s3,3)


结果如下:


image.png

⑥ split(pattern, string, maxsplit, flags)

split()函数是Python正则表达式中,专门用于“切分字符串”的函数。


split()函数语法格式如下:


pattern:你写的正则表达式;

string:待分割的字符串;

maxsplit:最大分割次数,默认为 0,表示不限制分割次数;

flag:修饰符;

有这样一个字符串s4,我们以“-”为分隔符切分字符串,看看使用split()函数会得到什么样的结果。


# '\D'表示匹配非数字
s4 = '136-3456-7413'
# 这里如果不指定“最大分割次数”,则是不限次数切分
re.split('\D',s4)
# 如果指定最大分割次数maxsplit=1,那么就只以第一个分隔符,进行切分
re.split('\D',s4,1)


结果如下:

image.png

限于篇幅!这篇文章就讲述到这里。当然,关于正则表达式中剩下的一些用法(比如说普通元字符、量化符、修饰符的用法),还有第二篇文章。



相关文章
|
4月前
|
Ruby
|
2月前
|
Windows Perl
Perl 教程 之 Perl 正则表达式 8
Perl的正则表达式是其强项,常用于字符串匹配、查找、替换等。基本操作包括:`.`匹配任意字符(除换行符),`x?`匹配0或1次`x`,`x*`匹配0或多次`x`,`x+`匹配1或多次`x`。还有范围匹配如`[0-9]`、否定匹配`[^a-z]`、边界匹配`\b`等。特殊序列如`\d`代表数字,`\s`代表空格,`()`用于记忆匹配内容,`/pattern/i`忽略大小写。
10 0
|
2月前
|
Perl
Perl 教程 之 Perl 正则表达式 7
Perl教程讲解了其强大的正则表达式功能,用于字符串匹配、查找、替换和提取。示例展示如何使用`/s`删除变量`$string`中的重复字符,输出结果为原字符串。其他实例包括将非数字字符替换为空格,删除tab和空格,以及将数字间字符替换为单个空格。
15 3
|
2月前
|
Perl
Perl 教程 之 Perl 正则表达式 6
**Perl正则表达式强大多能,常用于字符串匹配、替换和提取。转化操作符如`tr`用于字符转换,如将所有小写字母转大写:`$string =~ tr/a-z/A-Z/`。**
17 2
|
2月前
|
Perl
Perl 教程 之 Perl 正则表达式 4
简洁概括:Perl正则表达式强大,s///操作符用于字符串替换,例子展示替换&quot;google&quot;为&quot;baidu&quot;。
12 1
|
2月前
|
存储 算法 Shell
【Shell 命令集合 文档编辑】Linux 正则表达式匹配 egrep命令使用教程
【Shell 命令集合 文档编辑】Linux 正则表达式匹配 egrep命令使用教程
12 0
|
2月前
|
Perl
Perl 教程 之 Perl 正则表达式 1
Perl教程介绍了其强大的正则表达式功能,用于字符串匹配、替换和转化。匹配用m//(可简写为//),替换用s///,转化用tr///,常与=~或!~配合判断匹配与否。示例展示了m//在匹配字符串中的应用。
12 0
|
2月前
|
Python
除了`re`模块,还有哪些库可以用于正则表达式的匹配?
【2月更文挑战第11天】【2月更文挑战第31篇】
|
3月前
|
开发者 Python
Python中的正则表达式:re模块详解与实例
Python中的正则表达式:re模块详解与实例
|
4月前
|
Python Windows
【Python进阶必备】一文掌握re库:实战正则表达式
【Python进阶必备】一文掌握re库:实战正则表达式
83 0