代码详解:Python正则表达式的终极使用指南
803216
处理文本数据的一个主要任务就是创建许多以文本为基础的特性。
人们可能想要在文本中找出特定格式的内容,比如找出存在于文本中的电子邮件,或者大型文本中的电话号码。
虽然想要实现上述功能听起来很繁琐,但是如果使用Python正则表达式模块,就可以使这一操作更加简单。
假设要在一篇特定的文章中找出标点符号的数量。以狄更斯的作品文本为例。
你通常会怎么做?
最简单的方法如下:
如果没有可支配的re模块,那就要用到上面的代码。但如果有re模块,则只需两行代码:
本文讨论的是最常用的正则表达式模式,以及一些经常使用的正则表达式函数。
什么是正则表达式?
简而言之,正则表达式(regex)用于探索给定字符串中的固定模式。
我们想找到的模式可以是任何东西。
可以创建类似于查找电子邮件或手机号码的模式。还可以创建查找以a开头、以z结尾的字符串的模式。
在上面的例子中:
我们想找出的模式是 r’[,;.,–]’。这个模式可找出想要的4个字符中的任何一个。regex101是一个用于测试模式的工具。将模式应用到目标字符串时,呈现出以下界面。
如图所示,可以在目标字符串中根据需要找到,;.,–。
每当需要测试正则表达式时,都会用到上面的工具。这比一次又一次运行python要快得多,调试也容易得多。
现在我们已经可以在目标字符串中找到这些模式,那么如何真正创建这些模式呢?
创建模式
使用正则表达式时,首先需要学习的是如何创建模式。
接下来将对一些最常用的模式进行逐一介绍。
可以想到最简单的模式是一个简单的字符串。
但这并不是很有用。为了帮助创建复杂的模式,正则表达式提供了特殊的字符/操作符。下面来逐个看看这些操作符。请等待gif加载。
1.[]操作符
这在第一个例子中使用过,可用于找到符合这些方括号中条件的一个字符。
[abc]-将查找文本中出现的所有a、b或c
[a-z]-将查找文本中出现的所有从a到z的字母
[a-z0–9A-Z]-将查找文本中出现的所有从A到Z的大写字母、从a到z的小写字母和从0到9的数字。
可以很容易地在Python中运行下列代码:
除了.findall,正则表达式还有很多其他功能,稍后会涉及到。
2.点算符
点运算符(.) 用于匹配除换行符以外的任何字符。
运算符最大的优点是,它们可以结合使用。
例如,想在字符串中找出以小d或大写D开头,以字母e结尾,包含6个字母的子字符串。
3.一些元序列
在使用正则表达式时,一些模式会经常被用到。因此正则表达式为这些模式创建了一些快捷方式。最常用的快捷方式如下:
\\w,匹配任何字母、数字或下划线。相当于[a-zA-Z0–9_]
\\W,匹配除字母、数字或下划线以外的任何内容。
\\d,匹配任何十进制数字。相当于[0–9]。
\\D,匹配除十进制数字以外的任何数字。
4.加号和星形运算符
点算符只是用于获取任何字符的单个实例。如果想找出更多实例要怎么做呢?
加号+用于表示最左边字符的一个或多个实例。
星号*用于表示最左边字符的0个或多个实例。
例如,如果想找出所有以d开头,以e结尾的子字符串,d和e之间可以没有也可以有多个字符。我们可以用:d\\w*e
如果想找出所有以d开头,以e结尾的子字符串,在d和e之间至少有一个字符,我们可以用:d\\w+e
还可以使用更为通用的方法:用{}
\\w{n} – 重复\\w 正好n次。
\\w{n,} – 重复\\w至少n次,或者更多次。
\\w{n1, n2} – 重复 \\w 至少n1次,但不超过n2次。
5.^插入符号和$美元符号。
^插入符号匹配字符串的开始,而$美元符号则匹配字符串的结尾。
6.单词边界
这是一个重要的概念。
有没有注意到,在上面的例子中,总是匹配子字符串,而不是匹配单词?
如果想找出所有以d开头的单词呢?
可以使用d\\w*模式吗?下面用网络工具来试一试吧。
正则表达式函数
目前为止,只使用了 re包中的findall 函数,其实还有很多其他函数。下面来逐个介绍。
1. findall
上面已经使用了 findall。这是我最常使用的一个。下面来正式认识一下这个函数吧。
输入:模式和测试字符串
输出:字符串列表。
2.搜索
输入:模式和测试字符串
输出:首次匹配的位置对象。
可以使用下面编程获取该位置对象的数据:
3.替换
这个功能也很重要。当使用自然语言处理程序时,有时需要用X替换整数,或者可能需要编辑一些文件。任何文本编辑器中的查找和替换都可以做到。
输入:搜索模式、替换模式和目标字符串
输出:替换字符串
案例研究
正则表达式在许多需要验证的情况下都会用到。我们可能会在网站上看到类似这样的提示:“这不是有效的电子邮件地址”。虽然可以使用多个if和else条件来编写这样的提示,但正则表达式可能更具优势。
1.PAN编号
在美国,SSN(社会安全号码)是用于税务识别的号码,而在印度,税务识别用的则是 PAN号码。PAN的基本验证标准是:上面所有的字母都必须大写,字符的顺序如下:
<char><char><char><char><char><digit><digit><digit><digit><char>
那么问题是:
“ABcDE1234L”是有效的PAN号码吗?
如果没有正则表达式,该如何回答这个问题呢?可能会编写一个for循环,并进行遍历搜索。但如果用正则表达式,那就像下面这样简单:
2.查找域名
有时我们必须从一个庞大的文本文档中找出电话号码、电子邮件地址或域名等。
例如,假设有以下文本:
需要从上面文本中找出这里所有的域名—— askoxford.com;bnsf.com;hydrogencarsnow.com;mrvc.indianrail.gov.in;web.archive.org
该怎么做?
这里用到了or运算符,match返回元组,保留()里的模式部分。
3.查找电子邮件地址:
下面的正则表达式用于在长文本中查找电子邮件地址。
match=re.findall(r\'([\\w0-9-._]+@[\\w0-9-.]+[\\w0-9]{2,3})\’,string)
这些都是高级示例,提供的信息已经足够帮你理解这些示例了。
结论
虽然正则表达式看起来令人生畏,但它在数据操作、创建特性和寻找模式方面具有高度的灵活性。
留言 点赞 关注
我们一起分享AI学习与发展的干货
编译组:殷睿宣、李林虹
相关链接:
https://towardsdatascience.com/the-ultimate-guide-to-using-the-python-regex-module-69aad9e9ba56
如需转载,请后台留言,遵守转载规范
建议收藏!Python 正则表达式详解
正则表达式是对字符串提取的一套规则,我们把这个规则用正则里面的特定语法表达出来,去匹配满足这个规则的字符串。正则表达式具有通用型,不仅python里面可以用,其他的语言也一样适用。
python中re模块提供了正则表达式的功能,常用的有四个方法(match、search、findall)都可以用于匹配字符串
match
re.match()必须从字符串开头匹配!match方法尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。主要参数如下:
例子
从例子中我们可以看出,re.match()方法返回一个匹配的对象,而不是匹配的内容。如果需要返回内容则需要调用group()。通过调用span()可以获得匹配结果的位置。而如果从起始位置开始没有匹配成功,即便其他部分包含需要匹配的内容,re.match()也会返回None。
以下字符,都匹配单个字符数据。且开头(从字符串0位置开始)没匹配到,即使字符串其他部分包含需要匹配的内容,.match也会返回none
. 匹配任意一个字符
使用几个点号就代表几个字符
\\d 匹配数字
一个\\d代表一个数字。开头没匹配到,即使字符串其他部分包含需要匹配的内容,.match也会返回none
\\D 匹配非数字
开头没匹配到,即使字符串其他部分包含需要匹配的内容,.match也会返回none
\\s 匹配特殊字符,如空白,空格,tab等
\\S 匹配非空白
\\w 匹配单词、字符,如大小写字母,数字,_ 下划线
\\W 匹配非单词字符
[ ] 匹配[ ]中列举的字符
只允许出现[ ]中列举的字符
[^2345] 不匹配2345中的任意一个
[a-z3-5] 匹配a-z或者3-5中的字符
像上面写的那些都是匹配单个字符,如果我们要匹配多个字符的话,只能重复写匹配符。这样显然是不人性化的,所以我们还需要学习表达数量的字符
* 出现0次或无数次
+ 至少出现一次
? 1次或则0次
{m}指定出现m次
{m,} 至少出现m次
{m,n} 指定从m-n次的范围
$ 匹配结尾字符
定义整个字符串必须以指定字符串结尾
^ 匹配开头字符
定义整个字符串必须以指定字符开头
\\b 匹配一个单词的边界
\\b:表示字母数字与非字母数字的边界,非字母数字与字母数字的边界。即下面ve的右边不能有字母和数字
\\B 匹配非单词边界
| 匹配左右任意一个表达式
只要|两边任意一个表达式符合要求就行
(ab) 将括号中字符作为一个分组
()中的内容会作为一个元组字符装在元组中
和match差不多用法,从字符串中进行搜索
从字面意思上就可以看到,findall是寻找所有能匹配到的字符,并以列表的方式返回
findall中另外一个属性re.S
在字符串a中,包含换行符\\n,在这种情况下:
如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。
如下要寻找test.*123的数据,因为test和123在不同的行,如果没加re.s的话,他会在每一个进行匹配查找而不是将字符串作为一个整体进行查找
查找字符串中所有相匹配的数据进行替换
sub(要替换的数据,替换成什么,要替换的数据所在的数据)
对字符串进行分割,并返回一个列表
python里的数量词默认是贪婪的,总是尝试尽可能的匹配更多的字符。python中使用?号关闭贪婪模式
如
匹配手机号
要求,手机号为11位,必须以1开头,且第二个数字为35678其种一个
提取网页源码中所有的文字
如下,将其中的所有文字提取出来,去掉标签。思路就是运用sub方法,将标签替换为空
要提取出来最重要的就是关闭贪婪模式,
如果关闭贪婪模式,<xx>中的内容会尽可能多的匹配,只要能够满足后面的>就行,然后<>xxx<>中xxx内容也替换掉了
提取图片地址
原文链接:https://blog.csdn.net/qq_44159028/article/details/120575621
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。