jq 正则判断邮箱_Python正则15分钟入门

2c1a3d9b349cabccada0145190fa8c2d.png

lypython群里有同学问我,如何从大量格式不确定的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)

输出:

d76868c7f246c36c19f1cc49ff6dab3e.png

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

1.字符集

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

匹配字符

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

举例

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

输出:

4cd202c365b53df7b003ea6551e62f59.png

重复匹配

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

举例

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

输出:

0e59474aedc1695379fe89347f09d066.png

贪婪与懒惰

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

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

举例

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

输出

5b049d3a213c761dd86b437110753c6b.png

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

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

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')

输入结果

5afecdcb62cb48f99de5f5e1ffb4e392.png

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

过滤

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

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

输入结果:

ddffce22d84db2f8ee568fb2e923f9fe.png

查找位置

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

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())  ##字符串位置

输出结果

e350c15d538741709c1918e3b0a2152c.png

人生苦短,我用python早下班。如果觉得不错,对你工作中有帮助,请长按下面二维码关注我们。(回复训练营加群,一起探讨python问题)

55567494dd71c1dccee23c0dee5ac1d4.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值