正则表达式
正则表达式,简称为regex,是文本模式的描述方法。例如,\d是一个正则表达式,表示一位数字. 摘自《python编程快速上手》
创建正则表达式对象
import re
所有正则表达式函数都在re模块中。使用re.compile()传入字符串,返回值是一个Regex对象。Regex对象使用search()方法匹配文本,返回一个Match()对象,Match对象有一个group()方法,返回被查找的字符串中的实际字符。假如有分组,可以使用group()方法获取所有的分组。
匹配规则
- “ | ” 被称为管道,希望匹配多个表达式中一个时可以使用。
- 利用findall()方法,找到所有匹配的地方。返回的是字符串列表
- ?表示匹配这个问号之前的分组零次或一次
- *意味着匹配零次或多次
- +意味着匹配一次或多次
- {}指明匹配的次数,{3,5}表明匹配3、4、5个实例。
字符分类
字符 | 表示 |
\d | 0~9任意数字 |
\D | 除了0~9之外的任何字符 |
\w | 任何字母、数字或者下划线(可以理解为匹配单词) |
\W | 除了任何字母、数字或者下划线 |
\s | 空格、制表符和换行符 |
\S | 除了空格、制表符和换行符 |
插入字符和美元字符【可以理解为限制首尾】
^插入字符表明必须发生在被查找文本开始处
$美元字符表示该字符串必须以这个正则表达式的模式结束
通配字符
.称为“通配符”,匹配除了换行符之外的所有字符。
向re.compile()中传入第二个参数re.DOTALL,可让. 匹配包括换行符之内的所有字符。
不区分大小写
re.compile( , re.I)或者是re.compile( , re.IGNOGECASE)
项目实战
在一篇网页或文章中,找到所有电话号码和邮件地址,有一个程序可以在剪贴板文本中查找电话和Email地址,只需要CTRL+A然后CTRL+C,然后运行程序,就会用找到电话号码和Email地址,替换掉剪贴板中的文本
分析
- 从剪贴板中获取文本
- 找到文本中的电话和Email
- 粘贴掉剪贴板
行动方案
使用pyperclip模块复制和粘贴字符串
创建两个正则表达式
对两个正则表达式,找到所有匹配
将匹配好的字符串整理好格式,放在一个字符串中,用于粘贴
如果找不到,显示提示
项目代码:
import pyperclip,re
# 电话号码有12~15位,中间可能有分隔符
phoneRegex = re.compile(r'''(
\d{3}|(\d{3}\))? #区号
(\s|-|.)?
(\d{3})
(\s|-|.)
(\d{4})
(\s*(ext|x|ext.)\s*(\d{2,5}))?
)''', re.VERBOSE)
emailRegex = re.compile(r'''
[a-zA-z0-9._%+-]+ #用户名
@
[a-zA-z0-9.-]+ #域名
(\.[a-zA-Z]{2,4}) #有一些可能会有顶级域名
''', re.VERBOSE)
# 在剪贴板中找到匹配
text = str(pyperclip.paste)
matches = []
for groups in phoneRegex.findall(text):
# 1.3.5.8分别是区号,前3个数字,后4个数字和区号
phoneNum = '_'.join([groups[1],groups[3],groups[5]])
if groups[8] != '':
phoneNum += ' X' + groups[8]
matches.append(phoneNum)
for groups in emailRegex.findall(text):
matches.append(groups[0])
# 将所有匹配连接成一个字符串,复制到粘贴板
if len(matches)>0 :
pyperclip.copy('\n'.join(matches))
print("粘贴板的粘贴:")
print('\n'.join(matches))
else:
print('没有找到电话号码或者Email')