数据清洗之字符串操作和正则表达式

一、字符串对象方法

1. split()函数

split()函数可以将一个字符串分裂成多个字符串组成的列表

a = 'hello world'
a.split(' ')  # 将字符串a以' ' 进行拆分

输出结果:

['hello', 'world']

2. strip()函数

strip() 函数用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列:

a = '  hello world '
a.strip() # 删除字符串a头尾的空格

输出结果:

'hello world'
a = 'abahello worldaaa'
a.strip('a') # 删除字符串a头尾的字符a

输出结果:

'bahello world'

3. join()函数

join() 函数用于将序列(列表、元组等)中的元素以指定的字符连接生成一个新的字符串:

' '.join(['hello', 'world'])

输出结果:

'hello world'

4. 其它函数

在这里插入图片描述

二、正则表达式

1. 正则表达式简介

正则表达式提供了一种在文本中灵活查找或匹配字符串(通常是复杂的字符串)模式的方法,目的是为了字符串模式匹配,从而实现搜索替换功能。

正则表达式的基本组成元素可以分为:字符元字符。字符很好理解,就是基础的计算机字符编码,通常正则表达式里面使用的就是数字、英文字母。而元字符,也被称为特殊字符,是一些用来表示特殊语义的字符。如^表示非,|表示或等。利用这些元字符,才能构造出强大的表达式模式(pattern)。

详见正则表达式不要背

正则可视化工具1
正则可视化工具2
正则在线调试工具

2. 字符

2.1 一对一

最简单的正则表达式可以由简单的数字和字母组成,没有特殊的语义,纯粹就是一一对应的关系。如想在’apple’这个单词里找到‘a’这个字符,就直接用a这个正则就可以了。
在这里插入图片描述

但是如果想要匹配特殊字符的话,就要使用元字符\, 它是转义字符字符,顾名思义,就是让其后续的字符失去其本来的含义。比如要匹配* 这个符号,由于 * 这个符号本身是个特殊字符,所以我要利用转义元字符\来让它失去其本来的含义,即\*
在这里插入图片描述
其它特殊字符和对应的正则表达式:
在这里插入图片描述

2.2 一对多

集合区间和通配符可以实现一对多的匹配。

在正则表达式里,集合的定义方式是使用中括号[ ]。如[123]这个正则就能同时匹配1,2,3三个字符。

元字符-就可以用来表示区间范围,利用[0-9]就能匹配所有的数字, [a-z]则可以匹配所有的英文小写字母。

同时匹配多个字符的简便正则表达式:
在这里插入图片描述

举例:
在这里插入图片描述

3. 循环和重复

要实现多个字符的匹配,只要多次循环,重复使用一对一和一对多的正则规则就可以了。根据循环次数的多与少,我们可以分为0次,1次,多次,特定次。
在这里插入图片描述

4. 位置边界

在长文本字符串查找过程中,我们常常需要限制查询的位置。

4.1 单词边界

单词是构成句子和文章的基本单位,一个常见的使用场景是把文章或句子中的特定单词找出来。比如找出下面句子中的单词cat:

The cat scattered his food all over the room.

如果直接使用表达式cat,会同时匹配到cat和scattered这两处文本。这时候我们就需要使用边界正则表达式\b,它匹配单词的开始或结束,即\bcat\b
在这里插入图片描述

4.2 字符串边界

在匹配字符串的边界时,元字符^用来匹配字符串的开头,元字符$用来匹配字符串的末尾。

5. 修饰符

正则表达式常用的修饰符:
在这里插入图片描述
详见正则表达式 - 修饰符

6. 子表达式

从简单到复杂的正则表达式演变通常要采用分组回溯引用逻辑处理的思想。利用这三种规则,可以推演出无限复杂的正则表达式。

6.1 分组

分组就是指以()元字符所包含的正则表达式,每一个分组都是一个子表达式,是构成高级正则表达式的基础。如果只是使用简单的()匹配语法,本质上和不分组是一样的,如果要发挥它强大的作用,往往要结合回溯引用的方式。

6.2 回溯引用

所谓回溯引用(backreference)指的是模式的后面部分引用前面已经匹配到的子字符串。你可以把它想象成是变量,回溯引用的语法像\1,\2,…,其中\1表示引用第一个子表达式,\2表示引用第二个子表达式,以此类推。而\0则表示整个表达式。

比如现在要在下面这个文本里匹配两个连续相同的单词:

Hello what what is the first thing, and I am am scq000.

在这里插入图片描述

其中,\b表示单词的开始,(\w+)匹配一个单词,\s则是匹配空白字符,\1就是引用第一个子表达式,即(\w+)

6.3 非捕获正则

如果我们不想子表达式被引用,可以使用非捕获正则,即(?:regex),这样就可以避免浪费内存。regex为正则表达式。

6.4 前向查找

前向查找(lookahead)是用来限制后缀的。凡是以(?=regex)包含的子表达式,在匹配过程中,都会匹配regex表达式的前面内容,不返回本身。

比如要取到下面的阅读数,就可以用\d+(?=</span>)来匹配:

<span class=\"read-count\">阅读数:641</span>

在这里插入图片描述

6.5 后向查找

语法为(?<=regex),匹配regex表达式的后面的内容,不返回本身。

比如apple和people都包含ple这个后缀,但如果只想找到apple的ple,就可以通过限制ap这个前缀,来唯一确定ple这个单词了。

在这里插入图片描述

7. 与 或 非

只有在[]内部使用的^才表示非的关系。

在这里插入图片描述

8. 运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

在这里插入图片描述

9. 常用正则表达式

常用正则表达式1

常用正则表达式2

三、re库

Python内建的re模块是用于将正则表达式应用到字符串上的库。

re模块主要有三个主题:匹配、替代、拆分

假设我们想将含有多种空白字符(制表符、空格、换行符)的字符串拆分开:

text = 'hello world\t hello\nworld'
re.split('\s+', text)

输出结果:

['hello', 'world', 'hello', 'world']

在调用re.split('\s+', text)时,正则表达式首先会被编译,然后正则表达式的split方法在传入文本上被调用。也可以使用re.compile自行编译,形成一个可复用的正则表达式对象:

text = 'hello world\t hello\nworld'
regex = re.compile('\s+')
regex.split(text)

输出结果:

['hello', 'world', 'hello', 'world']

为了在正则表达式中避免转义符\的影响,可以使用原生字符串语法,比如r'C:\x'或者用等价的’C:\\x'

findall方法可用于获得所有匹配正则表达式的模式的列表:

text = 'hello world\t hello\nworld'
regex = re.compile('\s+')
regex.findall(text)

输出结果:

[' ', '\t ', '\n']

findall返回的是字符串中所有的匹配项,而search返回的仅仅是第一个匹配项。match更为严格,它只在字符串的起始位置进行匹配:

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值