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

一、字符串对象方法

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
    评论
### 回答1: 文本清洗是指对文本数据进行处理,去除无用信息,使其更加规范化和易于处理。在Java中,可以使用正则表达式来进行文本清洗。 正则表达式是一种用来描述字符串模式的语言,可以用来匹配、查找和替换文本中的特定模式。在Java中,可以使用java.util.regex包中的类来操作正则表达式。 常见的文本清洗操作包括去除空格、标点符号、HTML标签等。例如,可以使用正则表达式来去除字符串中的所有空格: String str = "hello world"; str = str.replaceAll("\\s+", ""); 这里的\\s表示空格字符,+表示匹配一个或多个空格字符。使用replaceAll()方法可以将所有匹配的空格字符替换为空字符串。 除了去除空格,还可以使用正则表达式来去除标点符号: String str = "hello, world!"; str = str.replaceAll("[\\p{Punct}&&[^']]+", ""); 这里的\\p{Punct}表示所有标点符号,&&[^']表示除了单引号之外的所有标点符号。使用replaceAll()方法可以将所有匹配的标点符号替换为空字符串。 另外,如果需要去除HTML标签,可以使用以下代码: String str = "<p>hello, <b>world</b>!</p>"; str = str.replaceAll("<[^>]+>", ""); 这里的<[^>]+>表示匹配所有HTML标签,使用replaceAll()方法可以将所有匹配的HTML标签替换为空字符串。 总之,使用正则表达式可以方便地进行文本清洗,使得文本数据更加规范化和易于处理。 ### 回答2: 随着大量数据的产生和积累,文本清洗成为数据处理的一个重要步骤。在文本处理中,可能会遇到一些格式上的问题,比如HTML标签、非法字符、标点符号等等,这些问题会影响数据分析和使用。正则表达式是一种强大的文本匹配和处理工具,可以帮助我们快速而准确地筛选和清洗文本数据。 在Java中,使用正则表达式进行文本清洗需要使用java.util.regex包中的类和方法。其中最常用的类是Pattern和Matcher。Pattern表示正则表达式,而Matcher则是用来匹配Pattern和输入字符串的工具。 在使用正则表达式进行文本清洗时,首先需要定义正则表达式的模式。比如,假设我们需要清洗一段HTML代码,把其中的标签去掉,可以定义如下正则表达式: String pattern = "<[^>]*>"; 这个正则表达式的含义是匹配尖括号包含的任意字符,其中^表示非,即除了尖括号以外的其他字符。[^>]*表示匹配任意个数的非尖括号字符。在这种情况下,这个正则表达式将会匹配所有的HTML标签,然后我们就可以使用Matcher将其替换为空字符串,例如: String html = "<html><body><p>Hello World!</p></body></html>"; String pattern = "<[^>]*>"; String cleanedHtml = html.replaceAll(pattern, ""); 这样就可以把原始HTML代码中的所有标签去掉,得到干净的文本数据。 除了HTML标签以外,还可能会遇到其他需要清洗的问题。比如,有些文本中可能包含了“垃圾”字符,如控制字符、特殊符号等等,这些字符可能无法正确地存储、处理或显示。在这种情况下,可以使用正则表达式来删除这些字符,例如: String text = "Hello\u0009World!\u000d\u000a"; String pattern = "[\u0000-\u001f\u007f]"; String cleanedText = text.replaceAll(pattern, ""); 这个正则表达式的含义是匹配ASCII码表中的控制字符和删除字符(\u0000-\u001f和\u007f),然后将其替换为空字符串。这样就可以去掉文本中的垃圾字符,得到干净的文本数据。 总之,正则表达式是一种强大的文本匹配和处理工具,可以帮助我们快速准确地清洗文本数据。在使用正则表达式时,需要对要处理的文本有一定的了解,并根据需要定义合适的正则表达式模式。正则表达式虽然强大,但也容易出错,因此需要仔细检查和调试。同时也需要注意正则表达式的效率问题,避免因过度使用正则表达式而导致程序性能下降。 ### 回答3: 文本清洗是计算机处理自然语言和文本数据的一项重要任务。其中,正则表达式是一种强大的工具,常用于文本清洗中去除不必要的字符和格式,从而增加文本数据的可读性、可解析性和可分析性。在Java编程语言中,使用正则表达式进行文本清洗也是十分常见的,下面将介绍练习Java字符串正则表达式之文本清洗的方法和技巧。 首先,需要了解正则表达式的基本语法和符号。Java中的正则表达式可以使用java.util.regex包中的类来实现,例如Pattern和Matcher。在使用正则表达式进行文本清洗时,需要注意以下几点: 1. 使用String类的replaceAll方法可以方便地进行字符串替换和清洗。其中,第一个参数是正则表达式,第二个参数是替换后的字符串。例如: String str = "Hello, World!"; str = str.replaceAll("[, !]", ""); // 输出结果:HelloWorld 2. 匹配多种模式可以使用“|”符号。例如,想要匹配“a”或“b”或“c”,可以写成: String pattern = "a|b|c"; 3. 需要匹配特殊字符时需要使用转义符“\”。例如,匹配句子中的引号可以写成: String pattern = "\".*?\""; 4. 使用“.*?”表示非贪婪匹配,尽可能少地匹配字符。例如,要匹配行末的换行符可以写成: String pattern = "\r?\n.*?"; 5. 使用“^”和“$”表示字符串的开头和结尾。例如,如果要匹配全是字母的行可以写成: String pattern = "^[a-zA-Z]+$"; 综上所述,正则表达式是Java字符串操作中的重要工具,可以通过其强大的匹配功能实现文本清洗和格式化。在使用过程中需要熟悉其基本语法和符号,并结合具体的需求进行灵活运用。随着深度学习和自然语言处理的快速发展,正则表达式在文本清洗中的应用也将愈加广泛和重要。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值