常用的几个正则表达式

本文结合Python的re模块演示结果,在别的编程软件上也容易实现。

注:作者刚学不久,有写的不到位的地方欢迎评论区指正。
1、手机号码问题

  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']
  1. 固定电话号码也是一样的道理,这里就不再重复了

2、邮箱问题

  1. 查找符合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']
  1. 将刚刚的正则表达式中的@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']
  1. 如果你想要查找所以符合邮箱格式的字符串,其中邮箱格式不限于@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、密码问题

  1. 密码要求为大小写字母和数字同时出现,对于下划线_则可有可无,密码位数为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']
  1. 美中不足的是刚才的正则表达式存在一个问题,如果把字符串更改为
    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的图片文件

  1. 这是前几天在爬取网页图片的时候所做的处理,想要爬取图片链接用来下载图片,这里我们只看正则表达式部分。
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']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值