# 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模块是一个让人头疼的模块多记