本文结合Python的re模块演示结果,在别的编程软件上也容易实现。
注:作者刚学不久,有写的不到位的地方欢迎评论区指正。
1、手机号码问题
- 手机号码都是1开头,第二位通常为3、5、6、7、8、9,剩下9位随机数字。例如你自己的手机号码。
# 表达式:1[356789]\d{9}
pat = re.compile(r"1[356789]\d{9}")
string_ = '我的手机号码:18679756666,她的手机号码为:18979756666'
print(pat.findall(string_))
# ['18679756666', '18979756666']
- 固定电话号码也是一样的道理,这里就不再重复了
2、邮箱问题
- 查找符合QQ邮箱格式的字符串,QQ邮箱由5-10位的数字及其邮箱后缀组成,例如243901@qq.com
# 表达式为:\d{5,10}@qq\.com
# 演示结果:
pat = re.compile(r"\d{5,10}@qq\.com")
string_ = "我的邮箱有24390145@qq.com,还有2439014545@163.com"
result = pat.findall(string_)
print(result)
# ['24390145@qq.com']
- 将刚刚的正则表达式中的@qq.com改成@qq.163.com即可查找163邮箱。如果你想两个邮箱都查找的话可以修改为
表达式:[0-9]{5,10}@(?:qq.com|163.com)
# 演示结果:
pat = re.compile(r"\d{5,10}@(?:qq.com|163.com)")
string_ = "我的邮箱有24390145@qq.com,还有2439014545@163.com"
result = pat.findall(string_)
print(result)
# ['24390145@qq.com', '2439014545@163.com']
- 如果你想要查找所以符合邮箱格式的字符串,其中邮箱格式不限于@qq.com和@163.com,则修改为
# 表达式:[0-9a-zA-Z_]+@[0-9a-zA-Z_]+\.[0-9a-zA-Z_]+\.?[0-9a-zA-Z_]*
# 演示结果:
pat = re.compile(r"[0-9a-zA-Z_]+@[0-9a-zA-Z_]+\.[0-9a-zA-Z_]+\.?[0-9a-zA-Z_]*")
string_ = '我的邮箱有2439014545@qq.com、2439014545@163.com、biubiuyun@outlook.com和didida243901@qrg.com.cn。'
result = pat.findall(string_)
print(result)
# ['2439014545@qq.com', '2439014545@163.com', 'biubiuyun@outlook.com', 'didida243901@qrg.com.cn']
3、密码问题
- 密码要求为大小写字母和数字同时出现,对于下划线_则可有可无,密码位数为8-12位。我一开始有想过这样的表达式:
r"[a-zA-Z](?=.*\d)(?=.*[A-Z])(?=.*[a-z])[0-9a-zA-Z_]{7,11}"
但是这样的话如果密码开头为小写字母,其余部分为大写和数字构成,这符合密码要求但不会被这个正则表达式检索。所以我编写了下面的表达式,分别考虑以小写字母和大写字母开头的情况
pat = re.compile(r"(?:[a-z](?=.*\d)(?=.*[A-Z])[0-9a-zA-Z_]{7,11}|[A-Z](?=.*\d)(?=.*[a-z])[0-9a-zA-Z_]{7,11})")
string_ = '我现在的密码是a1234ABC_,曾经用过a1234ABC和ABC123456'
print(pat.findall(string_))
# ['a1234ABC_', 'a1234ABC']
- 美中不足的是刚才的正则表达式存在一个问题,如果把字符串更改为
string_ = '我现在的密码是a1234ABC_,曾经用过ABC123456和a1234ABC'
则结果为['a1234ABC_', 'ABC123456', 'a1234ABC']
。这与我们想要的结果不一样,原因在于正则表达式中有一个正向先行预查存在,它预查到ABC123456后面还有a1234ABC中的小写字母a,所以将ABC123456也认为符合正则表达式。目前我还没想到一个理想的正则表达式可以解决这个问题,但是我可以提供一个解决办法。那就是对第一次查找到的结果做一次循环遍历,再进行第二次匹配。
pat = re.compile(r"(?:[a-z](?=.*\d)(?=.*[A-Z])[0-9a-zA-Z_]{7,11}|[A-Z](?=.*\d)(?=.*[a-z])[0-9a-zA-Z_]{7,11})")
string_ = '我现在的密码是a1234ABC_,曾经用过ABC123456和a1234ABC'
mima_all = pat.finditer(string_)
mima_right = []
for mima in mima_all:
if pat.search(mima.group(0)):
mima_right.append(mima.group())
print(mima_right)
# ['a1234ABC_', 'a1234ABC']
4、查找.jpg的图片文件
- 这是前几天在爬取网页图片的时候所做的处理,想要爬取图片链接用来下载图片,这里我们只看正则表达式部分。
string_ = "这里有几张图片很重要:222.jpg,akkA.jpg,此外,333akkA.jpg你也看看。"
pat = re.compile(r"[0-9a-zA-Z]+\.jpg")
result = pat.findall(string_)
print(result)
# ['222.jpg', 'akkA.jpg', '333akkA.jpg']