Python金融大数据挖掘与分析笔记(一)——正则表达式基础

正则表达式基础

findall() 函数

首先通过以下实例演示正则表达式的用法:

import re
content = "Today is January 12, 2020"
result = re.findall('\d\d\d\d', content)
print(result)

输出结果是result

  • findall() 函数的功能是在原始文本中寻找所有符合匹配规则的文本内容,其使用格式如下所示:
re.findall(匹配规则, 原始文本)

'\d’是一个特殊符号,表示匹配一个数字字符,下表列出了一些常用的特定符号及其功能。

符号功能说明
\d匹配1个数字字符
\w匹配1个字母、数字或下划线字符
\s匹配1个空白字符,如换行符、制表符、普通空格等
\S匹配1个非空白字符
\n匹配一个换行符
\t匹配1个制表符
.匹配1个任意符号,换行符除外
*匹配0个或多个表达式
+匹配1个或多个表达式
?非贪婪限定符,常与.和*配合使用
()匹配括号内的表达式,也表示一个组

非贪婪匹配

  • 简单理解:
    • 贪婪匹配:返回满足条件的最长的匹配结果。
    • 非贪婪匹配:返回满足条件的最短的匹配结果
      首先通过一个简单的示例比较一下两者的区别。
text = '文本A百度新闻文本B,新闻标题文本A新浪财经文本B,文本A搜狗新闻文本B新闻网址'
  • 贪婪匹配
import re
pattern = '文本A.*文本B'
result = re.findall(pattern, text)
print(result)

结果为:

[‘文本A百度新闻文本B,新闻标题文本A新浪财经文本B,文本A搜狗新闻文本B’]

  • 非贪婪匹配
import re
pattern = '文本A.*?文本B'
result = re.findall(pattern, text)
print(result)

匹配结果为:

[‘文本A百度新闻文本B’,‘文本A新浪财经文本B’,‘文本A搜狗新闻文本B’]

在代码书写上,非贪婪匹配是在贪婪匹配的基础上添加了非贪婪限定符’?’。

这里主要介绍非贪婪匹配的两种使用方法,一个是.?, 另一个是(.?),两者的区别在于,后者返回()中的内容,前者用于代替文本A和文本B之间的所有内容。

import re
pattern = '文本A(.*?)文本B'
result = re.findall(pattern, text)
print(result)

匹配结果为:

[‘百度新闻’,‘新浪财经’,‘搜狗新闻’]

我们通过下面的示例进一步说明两种非贪婪匹配方法的区别。
下面是我们爬取到的网页的一段代码,里面的新闻链接和新闻标题都位于

框内。
在这里插入图片描述
我们可以通过如下的方法获取新闻中的标题信息。代码如下:

import re
content = '''<h3 class="c-title">
		 <a href='https://baijiahao.baidu.com/s?id=1655481568620343403&amp;wfr=spider&amp;for=pc"
		    data-click="{
		      'f0':'77A717EA',
		      'f1':'9F63F1E4',
		      'f2':'4CA6DE6E',
		      'f3':'54E5243F',
		      't':'1578808251'
		      }"
		                target="_blank"
		            >
		      为什么说<em>阿里巴巴</em>已进化成为一家世界级的科技公司?
		    </a>
		</h3>'''
pattern = '<h3 class="c-title">.*?>(.*?)</a>'
result = re.findall(pattern, content, re.S) # re.S的作用是在进行findall查找时,可以自动考虑换行的影响
print(result)

输出结果为:

[’\n 为什么说阿里巴巴已进化成为一家世界级的科技公司?\n ']

从上面示例可以看出,我们需要的内容是“为什么说阿里巴巴已进化成为一家世界级的科技公司?”,为了获取该段内容,需要找到定位该内容的标志符号或者上下文特征内容。代码 < h 3 c l a s s = " c − t i t l e " > <h3 class="c-title"> <h3class="ctitle"> > > >之间,表示我们不关心的内容,所以可以使用".*?"进行替代。

  • 注意:findall函数中,我们使用了re.S修饰符来自动考虑换行的情况,这是因为.和*都不能表示换行符,最终的结果中多出的换行符内容,我们可以使用strip()函数去除。
for i in range(len(result)):
	result[i] = result[i].strip()

得到如下结果:

[‘为什么说阿里巴巴已进化成为一家世界级的科技公司?’]

sub()函数

sub()函数中的sub是substitute的缩写,该函数主要用于清洗正则表达式获取到的内容,其格式为:

re.sub(需要替换的内容, 替换值, 原字符串)

result[0] = re.sub('<.*?>', '', result[0])

正则化表达式中[]的用法

在正则化表达式中,“.”符号,“*”符号,“?”等都有特殊的含义,如果想定位这些符号,就需要使用[]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aidanmomo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值