python正则表达式基础re模块匹配电话号码和邮箱

# Python中isdecimal()函数的作用是检查一个字符串是否仅有十进制的数字字符构成。如果是则返回True,否则返回False
# 假设你希望在字符串中查找电话号码。你知道模式:3 个数字,一个短横线,3
# 个数字,一个短横线,再是 4 个数字。例如:415-555-4242

def is_phone_number(text):
    if len(text) != 12:
        return False
    for i in range(0, 3):
        if not text[i].isdecimal():
            return False
    if text[3] != "-":
        return False
    for i in range(4, 7):
        if not text[i].isdecimal():
            return False
    if text[7] != "-":
        return False
    for i in range(8, 12):
        if not text[i].isdecimal():
            return False

    return True


text = "111/555-6666"
print(is_phone_number(text))


message = 'Call me at 415-555-1011 tomorrow. 415-555-9999 is my office.'
for i in range(len(message)):
    chunk = message[i:i+12]
    if is_phone_number(chunk):
        print('Phone number found: ' + chunk)


import re
# 用正则表达式
# 三步骤:
# 1.创建Regex 对象re.compile()
# 2.查找匹配的字符串search()
# 3.用group返回group()
# \d表使匹配数字
# 向 re.compile()传入一个字符串值,表示正则表达式,它将返回一个 Regex 模式
# 对象(或者就简称为 Regex 对象)
phone_number_regx = re.compile(r"\d\d\d-\d\d\d-\d\d\d\d")
mo = phone_number_regx.search("My number is 415-555-4242.")
print(mo.group())
# 我们将期待的模式传递给 re.compile(),并将得到的 Regex 对象保存在
# phoneNumRegex 中。然后我们在 phoneNumRegex 上调用 search(),向它传入想查找
# 的字符串。查找的结果保存在变量 mo 中。在这个例子里,我们知道模式会在这个
# 字符串中找到,所以我们知道会返回一个 Match 对象。知道 mo 包含一个 Match 对
# 象,而不是空值 None,我们就可以在 mo 变量上调用 group(),返回匹配的结果。
# 将 mo.group()写在打印语句中,显示出完整的匹配,即 415-555-4242。


# search方法外,Regex对象也有一个findall()方法。search()将返回一个Match
# 对象,包含被查找字符串中的“第一次”匹配的文本,而 findall()方法将返回一组
# 字符串,包含被查找字符串中的所有匹配
# findall()不是返回一个 Match 对象,而是返回一个字符串列表
phone_number_find = re.compile(r"\d\d\d-\d\d\d-\d\d\d\d")
mf = phone_number_find.findall('Cell: 415-555-9999 Work: 212-555-0000')
print(mf)

# \d 0 到 9 的任何数字
# \D 除 0 到 9 的数字以外的任何字符
# \w 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
# \W 除字母、数字和下划线以外的任何字符
# \s 空格、制表符或换行符(可以认为是匹配“空白”字符)
# \S 除空格、制表符和换行符以外的任何字符

# 用 sub()方法替换字符串
msg = re.compile(r'Agent \w+')
msg_n = msg.sub("AAA", 'Agent Alice gave the secret documents to Agent Bob.')
print(msg_n) # 输出 AAA gave the secret documents to AAA.

# 项目:电话号码和 E-mail 地址提取程序
#  从剪贴板取得文本。
#  找出文本中所有的电话号码和 E-mail 地址。
#  将它们粘贴到剪贴板。
# 现在你可以开始思考,如何用代码来完成工作。代码需要做下面的事情:
#  使用 pyperclip 模块复制和粘贴字符串。
#  创建两个正则表达式,一个匹配电话号码,另一个匹配 E-mail 地址。
#  对两个正则表达式,找到所有的匹配,而不只是第一次匹配。
#  将匹配的字符串整理好格式,放在一个字符串中,用于粘贴。
#  如果文本中没有找到匹配,显示某种消息。

# 创建一个电话号码正则表达式
import pyperclip, re
# 电话号码匹配111-111-1111
phone_num_re = re.compile(
    r"""(
    (\d{3}|\(\d{3}\))?
    (\s|-|\.)? # separator
    (\d{3}) # first 3 digits
    (\s|-|\.) # separator
    (\d{4}) # last 4 digits
    (\s*(ext|x|ext.)\s*(\d{2,5}))?
    )""",  re.VERBOSE)
# emial匹配
emil_reg = re.compile(r'''(
    [a-zA-Z0-9._%+-]+ # username
    @ # @ symbol
    [a-zA-Z0-9.-]+ # domain name
    (\.[a-zA-Z]{2,4}) # dot-something 
    )''', re.VERBOSE)

text = str(pyperclip.paste())
matches = []
for groups in phone_num_re.findall(text):
    phoneNum = '-'.join([groups[1], groups[3], groups[5]])
    if groups[8] != '':
        phoneNum += ' x' + groups[8]
    matches.append(phoneNum)
for groups in emil_reg.findall(text):
    matches.append(groups[0])

if len(matches) > 0:
     pyperclip.copy('\n'.join(matches))
     print('Copied to clipboard:')
     print('\n'.join(matches))
else:
     print('No phone numbers or email addresses found.')‘

re模块是一个让人头疼的模块多记

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值