Python 教学 | “小白”友好型正则表达式教学(一)
引言
什么是正则表达式?用官话来说,正则表达式又称规则表达式(Regular Expression,常被简写为regex、regexp 或 RE),是一种文本模式,包括普通字符(例如英文字母)和特殊字符(称为“元字符”),是计算机科学中的一个概念,通常被用来检索、替换那些符合某个模式(规则)的文本。通俗点讲,正则表达就是一类具有规则的字符串,我们可以通过这个规则字符串去检索、替换或分割其他的常规字符串。
正则表达式有什么用?通过以上定义我们可以知道正则表达式是用来处理字符串(文本)的一种工具,它的应用场景非常之多,例如从一段文本中匹配(或者说抓取)手机号码、邮箱、IP 地址等具有一定规律的文本内容。当然这些未必能够引起你的注意,不过当我们把表格数据中每个单元格的内容都视作文本,那么我们清洗/处理表格数据的手段也变得更加丰富了。事实上,大名鼎鼎的 Python 数据处理库 pandas 已经在其内部引入了正则表达式,这里我们通过一个例子来简单了解正则表达式的作用。我们在使用 pandas 库处理一份保险业企业数据,其中一个字段表示企业所在地对应的的六位行政区划代码,数据如下图所示。340311
(安徽省蚌埠市淮上区)。我们非常清楚,正确的筛选条件应该是行政区划代码的前两位是31、32或33的其中一种,但就是不知道要怎么表示出来,如果使用正则表达式来表示,这恰好是最简单的事情。
data[data['行政区划代码'].str.contains('^31|^32|^33')] # data 表示上图中数据对象
我们使用上述一行代码就能够从全部数据中筛选出行政区划代码前两位是31、32或33的数据。此句代码中的^31|^32|^33
就是能够表示我们所设置的筛选条件的正则表达式。其中符号|
表示或者,^31
表示从字符串的开头处匹配数字31,合起来的含义就是从字符串的开头处匹配31,32或 33。
以上是正则表达式在表格处理中的一个简单使用场景,如果你觉实用或者有趣,那么我们会在下文向大家介绍更多关于它的知识。
一、关于正则表达式
学习如何使用正则表达式之前,笔者想先向大家介绍一些正则表达式的背景知识以及编写这份教程的出发点。
首先,正则表达式不是 Python 或某个编程语言独有的工具。Python 语言在 1991 年正式发布了第一版,而“正则表达式”这一概念的起源甚至可以追溯到 1951 年(网络上说法不一,大致在 20 世纪 50 年代),这比 Python 语言还早了整整 40 年,甚至比 1972 年发布的 C 语言还要早个二十多年!由于正则表达式的功能用途非常值得肯定,所以在现代主流的编程语言或工具语言(如 Stata、SQL)中均得到了保留和进化,且由于大部分编程语言中的正则表达式同根同源,所以它们中大部分的正则语法也是通用的,这就意味着当你学会使用 Python 正则表达式,那么在 Stata 或 SQL 中也能熟练地使用正则表达式了。不过不同语言的正则表达式语法和功能范围还是有少许差异的,这一点需要大家知道。
正则表达式是在计算机技术快速发展的历史背景下被发明出来的。在传统的文本处理中,人们需要花费大量时间来处理文本文件,在这种情况下,正则表达式的应用成为了一种非常高效的方法。随着计算机技术的持续发展,它在网页、软件开发方面占得重要地位,在处理复杂 html 文本等场景中逐渐被发扬光大,直到近十几年来,正则表达式被使用在各类文本的处理中。这期间,不少与正则表达式相关的书籍也相继出版,例如美国人Jeffrey E.F.Friedl
编写的《精通正则表达式(第三版)》,Ben Forta
先生编写的入门书籍《正则表达式必知必会》(译名)。值得一提的是,前者全书竟多达 500 多页,仅从该书页数我们就能知道,想要“精通”正则表达式绝非易事,实际上也完全没必要去精通它,因为不仅不现实,更不值得;相对于前者,后者则是更适合初学者使用的正则表达式参考书,该书短小精悍,系统性的介绍了正则表达式的主要功能和语法。不过此书也并非入门 Python 正则表达式的最优选,一方面,由于正则表达式起源于国外,所以绝大部分优秀书籍中的测试文本和案例大多是英文或者是 html 文本,并不适合社科学者参考使用;另一方面,书中的正则表达式语法并非是针对 Python 语言编写的,实测发现部分内容不能完全套用在 Python 数据处理中。基于以上问题,我们才要从下面四个出发点推出一个对初学“小白”十分友好的正则表达式教程。
由浅入深; 完整,实用但不繁琐; 完全适用于 Python 语言; 案例尽可能使用社科类数据,使教程易学易懂。
二、Python 中的正则表达式
Python 教学的上一期文章中,我们向大家介绍了几个数据处理常用的标准库。实际上在 Python 中,正则表达式的实现也是一个标准库,它就是re
。也就是说,在 Python 中使用正则表达式之前,需要事先导入 re 库。
import re # 导入正则表达式库 re
在正则表达式中,字符串(文本)的处理方式主要有三种:搜索、替换和分割。搜索可以是从目标文本中查找符合规则的文本信息,例如引言中匹配行政区划代码的案例;搜索也可以是验证目标文本是否符合正则规则,例如使用正则表达式验证用户输入的用户名是否合规(是否包含敏感词汇,长度是否过长……)等。替换则是指搜索指定文本并将它们替换成其他文本,这和 office 软件中的替换功能有点像,但是要更强大。搜索和替换是正则表达式最常用的两种用途,而分割则是根据指定规则的文本将一段长文本切分为多段短文本,例如使用正则表达式根据标点符号将一段文本切分为多个短句。
在 Python 的 re 库中, 不同的字符串(文本)处理方式对应着不同的函数,如下表所示。
正则函数 | 描述 |
---|---|
re.compile(pattern) | 正则表达式编译函数,当一个正则表达式(pattern)需要多次使用时,可以使用此函数事先进行编译,而不是在每一次调用之前都重新编译一次,这样做可以提高正则匹配效率。 |
re.search(pattern, string) | 正则搜索函数,扫描字符串 string 并查找与正则表达式 pattern 相匹配的对象,查找结果是一个 Match 对象,其中包含首个匹配成功的文本以及该文本在 string 中的位置区间。如果没有符合条件的文本,则返回结果是 None |
re.match(pattern, string) | 正则搜索函数,与 re.search 几乎一模一样,区别在于 re.match 只能从 string 的开头处进行扫描和匹配,常用于字符串验证。 |
re.findall(pattern, string) | 正则查找函数,扫描字符串 string 并查找所有与正则表达式 pattern 相匹配的对象,将搜索到的所有结果存放在一个列表中并返回。如果没有匹配到任何结果,则会返回一个空列表 [] |
re.sub(pattern, repl, string) | 正则替换函数,扫描字符串 string 并查找所有与正则表达式 pattern 相匹配的对象,然后将所有匹配到的对象都替换为 repl,无论替换多少次,最后都会返回替换后的 string |
re.split(pattern, string) | 正则分割函数,以所有与正则表达式 pattern 相匹配的对象为分割点,将字符串 string 切分为多个子文本,并将它存放在一个列表中返回。 |
如果你不是很明白上表中的函数,那么没有关系,这很正常,毕竟我们还没有正式地介绍它们的用法。学习正则表达式最重要、有效的方式就是实践,实践,还有……再实践。下面我们就以上表中的re.findall()
函数为切入点来向大家介绍 Python 正则表达式的使用方法。
三、从 findall 函数中体会何为正则表达式
1.普通文本匹配
普通文本匹配是正则表达式中最简单直白的匹配模式,该模式与 Excel/WPS 软件中的关键词搜索很相似,实际上就是直接从文本查找关键词。
re.findall('吉林', '吉林省吉林市丰满区江南公园')
# 得到:['吉林', '吉林']
以上代码的功能就是从字符串'吉林省吉林市丰满区江南公园'
中查找所有与正则表达式'吉林'
相匹配的字符串。没错,这里的正则表达式就是'吉林'
,只不过这是一个没有复杂规则的正则表达式,它的规则就是吉林二字而已。如果待匹配的文本中没有符合正则表达式的内容,那么re.findall()
函数将会返回一个空列表,例如:
re.findall('吉林', '浙江省杭州市钱塘区沿江湿地公园')
# 得到:[]
在实际的数据处理中,这种看似鸡肋的匹配模式只需再借助一个字符|
就会变得十分常用。举个例子,我们想要从一份五百万行的全国企业数据中找出位于浙江省的企业,方法是使用高德地图地理编码 API 根据数据中的“企业地址”字段获取这些企业所在地的经纬度和行政区划信息。由于数据量过大,如果整张表一起处理,处理速度会非常慢。为了应对此事,我们计划先对数据进行初步筛选,剔除企业地址一定不在浙江省的数据。如果一条数据的地址信息中出现了浙江省以外的省、地、区县的名称,且这些地区名称没有出现在浙江省内,那么这条数据对应的企业就一定不在浙江省内,进而可以被直接剔除。我们先从行政区划数据中提取出所有浙江省外的地名列表(共3000+项)。
['永修县',
'达孜区',
'安陆市',
'霍林郭勒市',
'化德县',
'镇江市',
'东宁市',
'常德市',
'肃州区',
'丰都县',
'回民区',
'吉安市',
'吴桥县',
'老河口市',
'盱眙县',
'襄城县',
'青河县',
……
……
]
如果我们使用循环的方法去判断这些地名是否在企业地址中出现,那么 500 万条数据,每一条数据都要进行最多 3000 次判断,预计总判断次数会多达几十亿次,这对计算机来说是一个庞大的开销。但如果我们使用正则表达式的话,就可以使用逻辑“或”字符|将所有地名连接成一个下面这样的正则表达式,那么 500 万条数据,每条数据只需要使用正则判断一次就可以了,使用正则表达式判断的代码如下。
re.findall('永修县|达孜区|安陆市|霍林郭勒市|化德县|……', 企业地址文本) # 放不下,所有没有写全
# 如果返回结果不为空,就说明地址文本中出现了浙江省外的地名
实际上这种模式就像是在一个地址信息中一次性搜索 3000+ 个关键词,经过实测,其处理速度要比使用循环快了 8 倍以上!更重要的是不需要再去写繁琐的循环代码了。如果使用re.compile()
函数事先编译好正则表达式,筛选速度还可以更快。
2.初识“元字符”
通过上面的例子,我们已经简单认识到正则表达式中字符|
(可以读作“或”)的妙用,像这种在正则表达式中能够表示某种特殊含义,而不是表示其本身的字符或特定结构,可以被称为元字符
。在正则表达式中,还有许多种类似的元字符,正是有这些灵活多变的元字符,正则表达式才具备强大的字符处理能力。下面我们来通过一些例子来简单介绍一些基本的元字符,在此之前,我们先将最基本的元字符罗列在下表中。
基本元字符 | 含义 |
---|---|
. | 匹配一个任意字符(不包括换行符 \n) |
| | 逻辑“或”操作符 |
[] | 匹配字符集合/区间中的一个字符 |
[^] | 匹配不在该字符集合/区间中的一个字符 |
\ | 转义符,对下一个字符进行转义 |
上表中元字符|
(逻辑“或”操作符)已经在上一节的案例中和引言中的案例中介绍过,这里不再过多说明。
(1)使用 .
匹配任意单个字符
在正则表达式中,用于匹配任意单个字符的元字符.
经常与其他元字符配合使用,单独使用元字符.
的情况比较少,单独使用时具有占位符的含义。
re.findall('202.', '2020 到 2023 年间,我住在人民路202号202')
# 得到: ['2020', '2023', '202号']
re.findall('..', '2020 到 2023 年间,我住在人民路202号202')
# 得到: ['20', '20', ' 到', ' 2', '02', '3 ', '年间', ',我', '住在', '长安', '街2', '02', '号2', '02']
在上述第一行代码中,正则表达式'202.'
中的.
就表示字符串202
后面的一个任意字符,其含义就是找到以字符串 '202' 开头的,长度为 4 的字符串,在确认前三个字符是 '202' 的情况下,第四个字符是什么都无所谓(唯独不能是换行符\n
)。所以在待匹配字符串中,虽然出现了四次 '202',但因为最后一个 '202' 后面没有任何字符了,所以只有前三个可以被搜索到。
2020 到 2023 年间,我住在人民路202号202
而在第二行代码中,正则表达式'..'
则代表两个任意连续字符(不能是换行符\n
),包括空格符和标点符号。所以搜索结果中都是两两一对的字符串。
(2)使用[]
匹配字符集合/区间
使用正则表达式时,常常会对特定的字符类进行查找或替换,比如说任意数字,任意英文字母,任意汉字,指定标点符号等等。在正则表达式的规则中,类似的匹配规则都可以使用字符集合/区间来表示,常见的字符区间如下表所示。
字符区间 | 描述 |
---|---|
[0-9] | 匹配0-9之间的任意单个数字,注意是单个数字 |
[a-z] | 匹配a-z之间的任意单个小写字母 |
[A-Z] | 匹配A-Z之间的任意单个大写字母 |
[\u4e00-\u9fa5] | 匹配一个任意中文汉字,这个字符区间的含义并不是一目了然的,不过它还有另外一个同义的表示:[一-龥] (龥yù)。Python3 使用的是 Unicode 编码,汉字“一”的 Unicode 编码是\u4e00 ,汉字“龥”的 Unicode 编码是\u9fa5 ,他们之间的编码所对应的字符恰好是所有中文汉字(包括繁体字),所以[\u4e00-\u9fa5] 与[一-龥] 的含义是完全相同的,都可以用来匹配汉字。 |
💡在正则表达式字符区间中,连字符-
也是一个元字符,用来表示区间。不过仅当它出现在[]
中时才表示元字符,在[]
之外时,-
只是一个普通字符。
另外,使用字符区间时要避免尾字符小于首字符,例如[9-0]
,因为这样做是没有任何意义的,Python 正则表达式无法识别这样的字符区间,程序会直接报错。
re.findall('[0-9]', '2023.04论文版本2')
# 得到: ['2', '0', '2', '3', '0', '4', '2']
上述代码中,我们使用正则表达式'[0-9]'
就可以搜索待匹配字符串中的单个数字,同理,使用[a-z]
就可以搜索任意单个小写字母;使用[A-Z]
就可以搜索任意单个大写字母;使用[\u4e00-\u9fa5]
或[一-龥]
就可以搜索任意单个汉字。测试代码如下。
re.findall('[a-z]', 'Digital Economy')
# 得到:['i', 'g', 'i', 't', 'a', 'l', 'c', 'o', 'n', 'o', 'm', 'y']
re.findall('[A-Z]', 'Digital Economy')
# 得到:['D', 'E']
re.findall('[\u4e00-\u9fa5]', '数字经济(Digital Economy)')
# 得到:['数', '字', '经', '济']
re.findall('[一-龥]', '数字经济(Digital Economy)')
# 得到:['数', '字', '经', '济']
字符区间还有另外几个变种,这些变种让正则表达式的字符区间匹配模式变得更加灵活,笔者将一些变种罗列在下表中供大家学习参考。
字符区间的变种 | 描述 |
---|---|
[1-6] | 匹配1-6之间的任意单个数字 |
[A-Za-z] | 匹配任意单个大写字母或单个小写字母,等价于[A-Z][a-z] |
[a-zA-Z] | 同上,各字符区间不受顺序影响 |
[A-z] | 匹配任意单个大写字母或单个小写字母,等价于以上两项 |
[a-zA-Z0-9] | 匹配任意单个大写字母或单个小写字母或0-9之间的单个数字 |
[A-Kh-z] | 匹配任意单个 A-K 之间的大写字母或单个 h-z 之间的小写字母 |
以上是正则表达式字符区间的相关知识,除了字符区间,元字符[]
还能表示字符集合。字符区间常用于匹配一些有规律、可以比较大小的字符,正如上文中的数字区间或字母区间,而字符集合则更适合匹配一些没有明显规律或散乱的字符。例如正则表达式[个十百千万亿]
可以用来匹配“个十百千万亿”中的任意一个字符。示例代码如下。
re.findall('[个十百千万亿]', '二零二三年,中国人口总量超过十四亿')
# 得到:['十', '亿']
根据上面的例子我们可以发现,字符集合实际上就是把所有的待匹配单个字符都罗列在[]
中,根据这个原理,我们发现字符区间也可以被写为字符集合,如下表所示。
字符区间表示法 | 字符集合表示法 | 含义 |
---|---|---|
[0-9] | [0123456789] | 匹配0-9之间的单个数字 |
[a-z] | [abcdefghijklmnopqrstuvwxyz] | 匹配单个英文小写字母 |
[A-Z] | [ABCDEFGHIJKLMNOPQRSTUVWXYZ] | 匹配单个英文大写字母 |
在知道这些之后,我们来告诉你,其实字符区间和字符集合还可以放在一起使用,如下表所示。
字符区间/集合 | 描述 |
---|---|
[0-9个位名] | 匹配0-9之间的单个数字或“个位名”中的任意单个字符 |
[个位名0-9] | 含义同上,字符区间与字符集合之间顺序随意 |
re.findall('[0-9个位名]', '张三、李四等21名股东')
# 得到:['2', '1', '名']
(3)使用 [^]
匹配非字符集合/区间
如果我们希望匹配文本中的数字,可以使用正则表达式[0-9]
,可如果我们需要匹配文本中的非数字字符呢?简单明了的答案就是取反,那么元字符[^]
就是来做这种事情的。
re.findall('[^0-9]', '2023.04论文版本2')
# 得到:['.', '论', '文', '版', '本']
在上述代码中,正则表达式[^0-9]
就表示匹配单个除数字 0-9 之外的字符,其中元字符^
表示取反。
💡元字符^
有两个含义,一个表示匹配字符串的开头,这个可以参考本文引言中的案例;另一个含义就是取反,不过仅当^
出现在元字符[]
中的第一位时,才表示取反。如果^
出现在元字符[]
中的其他位置,则表示^
字符本身。
该匹配模式的语法与字符集合/区间语法几乎完全一样,区别就是当需要匹配非字符集合/区间时,要在左中括号[
的后面加上逻辑“非”元字符^
。即使是在稍微复杂一些的字符区间/集合中,也只需要在最前面加一个^
就可以了。
正确语法: [^a-zA-Z0-9]
,用于匹配非字母、数字的单个字符错误语法: [^a-z^A-Z^0-9]
(含义与正确语法稍不同,也能用,但不建议)
(4)正则中的转义符\
在 Python 教学系列的文章中,我们曾介绍过转义符\在字符串中的作用,可以参考下面这篇文章。
Python教学 | Python 字符串操作(上)
转义符除了可以表示 Python 中的换行符、制表符等特殊字符,还可以在正则表达式中表示特殊类字符,表示元字符本身以及反向引用,这些是正则表达式中转义符的主要作用。
首先,转义符\
可以在正则表达式中转义任何元字符,让元字符只能匹配其本身,例如我想使用正则表达式匹配字符.
,可这个字符在正则表达式中是一个元字符,表示匹配任意单个字符。例如在匹配文件名称(包含文件扩展名)时,匹配文件扩展名中的字符.
时就可以借助转义符\
,示例代码如下。
# 使用正则表达式匹配文件扩展名为 .xlsx 的文件名
re.findall('.*?\.xlsx', '所有xlsx文件名单.xlsx, 非xlsx文件清单.pdf')
# 得到:['所有xlsx文件名单.xlsx']
上述代码中,正则表达式'.*?\.xlsx'
中使用了两个.
,第一个表示匹配任意字符,*?
是表示量词的元字符,.*?
则表示零到多个任意字符,这个我们后续会向大家介绍;第二个.
的前面加了一个\
,那么\.
就表示普通字符.
,是用来匹配文件扩展名.xlsx
中字符.
的,这个时候\.
就不能用来匹配任意字符了。如果我们没有使用\
对.
进行转义,那么将会得到下面的错误结果。
re.findall('.*?.xlsx', '所有xlsx文件名单.xlsx, 非xlsx文件清单.pdf')
# 得到:['所有xlsx', '文件名单.xlsx', ', 非xlsx']
同样地,如果我们想要匹配文本中的[
、]
、^
以及转义符\
本身,都可以使用转义符\
进行转义。
转义符\
的另一个作用就是用来表示特殊类字符,在 Python 语言中,转义符\
本身就具有表示特殊字符的作用,例如\n
表示换行符,\t
表示横向制表符。在正则表达式中,除了表示某个特殊字符,转义符\
还可以帮助匹配某一类字符。常用常见的用法如下表所示。
特殊元字符 | 描述 |
---|---|
\d | 匹配任意单个0-9之间的数字 |
\D | \d 的反义,匹配任意单个非0-9之间的数字 |
\s | 匹配任意单个空白字符,包括空格符 、换行符\n 、横向制表符\t 、纵向制表符\v 、回车符\r 、换页符\f 、退格符[\b] 等。 |
\S | \s 的反义,匹配任意单个非空字符 |
\w | 匹配任意单个数字,英文字母或下划线_中的一个,实际上也可以匹配到 Unicode 字符,例如中文汉字 |
\W | \w 的反义,匹配任意单个非数字,英文字母,下划线_ 或非 Unicode 字符 |
\b | 匹配英文单词的边界(开头和结尾),和空格符 有些类似,常用在处理英文文本。 |
\B | \b 的反义 |
观察上表可以发现,原来元字符\d
也能用于匹配 0-9 之间的数字。确实如此,在 Python 正则表达式中,使用转义类元字符可以替代部分字符区间/集合。
元字符 \d
等价于字符区间[0-9]
元字符 \D
等价于非字符区间[^0-9]
元字符 \w
等价于字符区间/集合[0-9A-Za-z_]
,实际上 \w 也能匹配中文汉字元字符 \W
等价于字符区间/集合[^0-9A-Za-z_]
re.findall('\d', '2022年度报告.pdf')
# 得到:['2', '0', '2', '2']
re.findall('\D', '2022年度报告.pdf')
# 得到:['年', '度', '报', '告', '.', 'p', 'd', 'f']
re.findall('\w', '数字经济(Digital Economy)')
# 得到:['数', '字', '经', '济', 'D', 'i', 'g', 'i', 't', 'a', 'l', 'E', 'c', 'o', 'n', 'o', 'm', 'y']
re.findall('\W', '数字经济(Digital Economy)')
# # 得到:['(', ' ', ')']
除了以上这些,元字符\s
也非常重要,它可以直接匹配常见的空白字符,在数据清洗中十分重要、常用(常常与re.sub()
函数配合使用,用于去除文本中的空白字符,这个后续的文章会着重介绍)。而元字符\b
常用在英文文本的处理工作中,用处不大又不易理解,这里就不再详细介绍了。
四、【预告】正则点睛之笔——量词元字符
大家应该已经注意到了,在上一节介绍正则表达式基本元字符时,我们都会刻意强调,文中的各种元字符都是用来匹配单个字符的,所以大家可能会觉得这些元字符看似花哨,却无用武之地。实际情况可不是这样的,Python 正则表达式当然不可能每次只匹配单个字符,在正则表达式中,还有另外一类表示量词的元字符,这些量词元字符可以用来修饰其他元字符,限定其他元字符的匹配次数。只有熟练使用量词元字符,正则表达式才能发挥其真正的威力。例如在上文中介绍正则转义符\
的第一个示例代码中,我们想要匹配文件扩展名为.xlsx
的文件名。我们使用了如下正则表达式。
.*?\.xlsx
文件名的名称部分往往不止一个字符,所以上述正则表达式中的*?
就是一组用来限定.
(任意单个字符)匹配次数的量词元字符。量词元字符的使用是一个重难点,所以本文只向大家介绍了一部分基本的元字符,还未涉及量词元字符。一方面是学习顺序问题,量词元字符是用来修饰其他基本元字符的,所以学习量词元字符之前要先了解基本元字符;另一方面是知识量的缘故,量词元字符并不是三言两语能够讲明白的,所以还是下期文章再详细介绍吧!
最后,笔者向大家推荐一个正则表达式在线练习网站(笔者仍推荐大家在本地 Python 环境中学习正则表达式,还没有安装 Python 环境的同学,可以先在此网站中测试正则表达式)。
https://regex101.com/
在这个网站上,你可以选择不同的编程语言,还可以清晰明了的查看正则表达式的匹配内容。
总结
从本文介绍的知识量中大概也能管中窥豹,算是对正则表达式略知一二了。正如笔者所言,正则表达式绝非一个小知识块,实际上正则表达式几乎要算得上是一门编程语言了!这门语言看似十分唬人,但入门后你就会发现好像也没有那么的难学,反而挺有意思。总的来说,在学习正则表达式这件事上,入门才是才是最难的一步,因为超过八成的人已经被正则表达式“唬人”的外表拦在门外了。如果你认真读完本文,并理解了其中一些内容,那么恭喜,你已经成功入门正则表达式了。
下期 Python 教学文章我们将继续向大家介绍正则表达式,学习更多关于正则表达式的知识。
相关内容
Python教学
学习 Python 第一步——环境安装与配置 Python 基本数据类型 Python 字符串操作(上) Python 字符串操作(下) Python 变量与基本运算 组合数据类型-列表 组合数据类型-集合(内含实例) 组合数据类型 - 字典&元组 Python 中的分支结构(判断语句) Python 中的循环结构(上) Python 中的循环结构(下) Python教学 | Python函数的定义与调用 Python教学 | Python 内置函数 Python教学 | 最常用的标准库之一 —— os 本期 持续更新中……
星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!
点击搜索你感兴趣的内容吧
往期推荐
Python教学 | 盘点 Python 数据处理常用标准库
Python教学 | 最常用的标准库之一 —— os
案例分享:使用 Python 批量处理统计年鉴数据(下)
案例分享:使用 Python 批量处理统计年鉴数据(上)
Python教学 | Python 内置函数
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
推荐 | 青酱
欢迎扫描👇二维码添加关注