1. FlyPython首页
  2. Python入门

Python正则15分钟入门


flypython群里有同学问我,如何从大量格式不确定的word文档抽取姓名、电话号码、邮箱等信息存入excel表格。通过之前我们的文章,他已经学会读取和写入文档和表格,但就是无法处理格式不确定的文档。这里介绍的正则方法,可以帮助他解决这个问题。

目标

15分钟内让你真正明白正则表达式是什么,并且让你可以在自己的python程序里正确使用它。

你将学会:

  1. 极简python使用正则的方法
  2. 如果利用python高效的匹配字符串
  3. 如何利用python正则进行文本判断、过滤、信息提取

0.极简正则入门

假设程序从word或者excel读取了一串字符串,字符串中有一部分是电话号码,现在需要完整提取这个电话号码。

import re
reg=re.compile("[0-9]+")
a=reg.findall("我的电话是3555487")
print(a)

输出:

Python正则15分钟入门

解释:
"[0-9]+"是正则表达式,意思是匹配0-9的数字,"+"
表示可以匹配1次-多次,reg.findall表示从后面的字符串里找到所有的匹配值。

1.字符集

字符集,又叫元字符,就是用一些特殊符号表示特定种类的字符或位置。

匹配字符

代码  说明
.匹配除换行符以外的任意一个字符
\d匹配数字
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
^匹配字符串的开始
$匹配字符串的结束

举例

import re
reg=re.compile("我.")
a=reg.findall("我的电话是3555487")
print(a)

输出:

重复匹配

代码  说明
*重复0次-无数次
+重复1次-无数次
?重复0次-1次
{m}重复m次
{m,n}重复m-n次

举例

import re
reg=re.compile("5+")
a=reg.findall("我的电话是3555487")
print(a)

输出:

Python正则15分钟入门

贪婪与懒惰

贪婪:匹配尽可能长的字符串
懒惰:匹配尽可能短的字符串
懒惰模式的启用只需在重复元字符之后加?既可。

  • *? 重复任意次,但尽可能少重复
  • +? 重复1次或更多次,但尽可能少重复
  • ?? 重复0次或1次,但尽可能少重复
  • {n,m}? 重复n到m次,但尽可能少重复
  • {n,}? 重复n次以上,但尽可能少重复

举例

import re
reg=re.compile("5+?")
a=reg.findall("我的电话是3555487")
print(a)

输出

Python正则15分钟入门

注意:
如果想匹配元字符本身或者正则中的一些特殊字符,使用\\转义。

这里介绍的正则内容是最基础的,想要了解更详细的正则表达式语法,请参考:

2.利用正则判断

判断

有时候我们想利用正则表达式对用户输入进行判断,比如判断用户输入的身份证号是否符合规则,那么可以这样写:

import re
r=r'^([1-9]\d{5}[12]\d{3}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])\d{3}[0-9xX])$'

s1 = '110102200101014779'

#判断s1字符串是符合正则r
an = re.search(r, s1)
if an:
    print ('yes')
else:
    print ('no')

输入结果

Python正则15分钟入门

说明:^字符表示必须匹配字符串开头;$表示必须匹配字符串结尾。

过滤

假设,输出一串文本,只想保留汉字,去除特殊符号。代码如下:

import re
special_character_removal = re.compile(r'[,。、【 】“”:;()《》‘’{}?!⑦%>℃.^-——=&#@¥『』]', re.IGNORECASE)
line="贾蓉看了说:“高明的很。还要请教先生,这病与『性』命终久有妨无妨?”"
l = special_character_removal.sub('', line)
print(l)

输入结果:

Python正则15分钟入门


查找位置

查找某个文本在字符串中的位置,一般用于信息提取。

import re
p = re.compile("\d+")
content="2019年9月9月9日"
result2 = p.finditer(content)

for m in result2:
    print("str",m.group())  ##字符串
    print("start: ",m.start()," end: ",m.end())  ##字符串位置

输出结果

Python正则15分钟入门

人生苦短,我用python早下班。如果觉得不错,对你工作中有帮助,请关注我们。

原创文章,作者:flypython,如若转载,请注明出处:http://flypython.com/tutorial/69.html