细说Python操作之正则表达式
系列文章目录
第一章:Python 操作之正则表达式
文章目录
- 系列文章目录
- 前言
- 一、pandas是什么?
- 二、使用步骤
- 1.引入库
- 2.读入数据
- 总结
前言
正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于匹配字符串中字符组合的模式描述工具。它广泛用于文本搜索、数据验证、字符串替换等领域。正则表达式通过特定的语法规则,定义了搜索模式,可以高效地查找、替换或验证字符串是否符合特定的格式。
以下是我列举的正则表达式的基本元素和用法示例:
一、元字符:
元在中文之中有一个解释是“根本”。万丈高楼平地起,其实在我认知中学会元字符的应用,就如用砖瓦,已经可以盖起来一座相当高的楼层了,毕竟元字符是正则表达式的基础,语法都是由元字符的运用演化而来,所以理解元字符的用法是重中之重。下面是我列举的一些常规元字符的用法:
1.1通配符.与字符集[]:
顾名思义,通配符是可以理解为能够广泛对字符进行匹配,包括但不限于字符串、数字、汉字、特殊符号等
而字符集就可以看做是一个你输入的匹配限定条件的集合,只有满足字符集之中的内容才会进行匹配
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
[ ] | 匹配字母或数字或下划线或汉字 |
1.1.1通配符. 可以匹配到除了\n意外的其他字符,一个符号占据的是一个字符的位置
以字符串为例:s= "apple ape agree age amaze animate advertise a\ne"
我们可以看到字符串s之中是存在\n这个换行符的
我们要查找三个字母,有a开头e结尾的字符串那么得到的结果是:
s= "apple ape agree age amaze animate advertise a\ne"
ret = re.findall('a.e',s)
如果我们再要查找四个字母,有a开头e结尾的字符串,则需要再加一个.符号,例如:
s= "apple ape agree age amaze animate advertise a\ne"
ret = re.findall('a..e',s)
1.1.2字符集[]匹配字母或数字或下划线或汉字,一个[]识别匹配的是[]中的一个符号
以字符串为例:s= "apple ape agree age amaze animate advertise alne a&e a2e a6e a9e"
我们需要的是以a开头,以e结尾的三个由字母组成的字符串,那么.就不适用了,因为通配符会匹配任意除换行符以外的字符,那么这里就需要使用字符集来进行字符的定向选择
s= "apple ape agree age amaze animate advertise alne a&e a2e a6e a9e"
ret = re.findall('a[a-z]e',s)
[a-z]中a-z其实指的是英文字母a一直到z,是一个范围条件
如果我们再要查找四个字母,有a开头e结尾的字符串,则需要再加一个[]符号,例如:
s= "apple ape agree age amaze animate advertise alne a&e a2e a6e a9e"
ret = re.findall('a[a-z][a-z]e',s)
而[]也可以限制选择的字符是数字还是特殊符号,例如:
ret = re.findall('a[0-9]e',s)
·
ret = re.findall('a[&|6]e',s)
注:|是或运算符
其中还有一个需要注意的字符,那就是取反字符^,这个放在字符串前面表示就是匹配字符串开始的位置(下文会说明),而放在字符集里面表示取反[^0-9]即不取0到9的数字,那么就是非数字字符与\D等效;[^a-zA-Z0-9_]表示不取数字、字母和下划线,等价于\W(\D与\W转义字符会给予说明)
s= "apple ape agree age amaze animate advertise alne a&e a2e a6e a9e"
ret = re.findall('a[^0-9]e',s)
1.2重复元字符:
顾名思义,重复元字符就是用来匹配一个或多个重复的字符或子表达式
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
1.2.2{}的用法:
思想就是{}中,通过添加数字,来决定匹配重复字符的次数,形式是 需要匹配的内容{n,m}
以字符串为例:s= "aecee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"
如果我们需要找到以a开头以e结尾的五个字符,那么根据上文通配符可以写成 re.findall('a...e',s)
但是我们可能会遇到百八十个的情况,就不能只靠.,那么就需要使用{}:
s= "aecee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"
ret = re.findall('a.{3}e',s)
如果我们需要匹配以a开头,以e结尾的长度最大为7的字符,那么就可以在{}中限制查找条件
s= "aecee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"
ret = re.findall('a.{0,5}e',s)
我们不希望取到中间有数字、特殊符号、空格怎么办?
s= "aeeee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"
ret = re.findall('a[^0-9\\n\\s&]{0,100}e',s)
有人注意到,列表最后两个元素中存在a&e age和a6e a9e,为什么不是单独拆开的呢?
其实这里涉及到重复元字符中默认的贪婪匹配,先是以a开头,以e结尾,以{}中最大为5来进行查找,如果5找不到,那么在以a、e之间为4个字符来进行匹配,一次类推,直到a、e之间为0个字符。而a&e age和a6e a9e中空格字符占据了一个字符的位置,实际的匹配就是a【&e ag】e和a【6e a9】e。
注:下面的*、+、?都默认贪婪匹配
如何取消贪婪匹配呢?可以在重复元字符后面跟一个问号,*、+、?也适用
以s= "aeeee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"为例:、
贪婪匹配:
s= "aeeee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"
ret = re.findall('a[^0-9\\n\\s&]*e',s)
非贪婪:
s= "aeeee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"
ret = re.findall('a[^0-9\\n\\s&]*?e',s)
1.2.2*的用法:
*其实就是{0,∞}的缩写,即从字符串末尾开始匹配
s= "aecee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"
ret = re.findall('a.*e',s)
这里匹配不到字符串末尾是因为换行符的存在,通配符是匹配不到换行符的,所以,列表中出现了两个元素
1.2.3+的用法:
+其实就是{1,∞}的缩写
s= "aecee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"
ret = re.findall('a.+e',s)
1.2.4?的用法:
?其实就是{0,1}的缩写
s= "aeeee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"
ret = re.findall('a.?e',s)
取消贪婪为
s= "aeeee apple acre ape agree age anaze animate advertise a\ne a&e age a6e a9e"
ret = re.findall('a.??e',s)
1.3转义符:
代码 | 说明 |
---|---|
\w | 匹配字母或数字或下划线或汉字 |
\W | 匹配一个非字母、非数字或非下划线字符(等价于 [^a-zA-Z0-9_] ) |
\d | 匹配数字 |
\D | 匹配一个非数字字符 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始(在集合字符里[^a]表示非(不匹配)的意思 |
$ | 匹配字符串的结束 |
\s | 匹配任意的空白符 |
二、其他语法:
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。