练习1:
# 《python编程快速上手》p130, 7.15
# 项目:电话号码和Email提取程序
"""假设你需要在一篇网页或文章中,找出所有电话号码和邮件地址。这个程序可以在剪贴板的文本中查找电话和邮件。分步骤如下
1、从剪贴板取得文本
2、找出文本中的所有电话和Email地址
3、将它们粘贴到剪贴板
具体的代码包括一下部分:
1、使用pyperclip复制和粘贴
2、创建两个正则表达式,分别匹配电话和邮件
3、将匹配的字符串整理好,放在一个字符串中
4、如果文本中没有找到匹配,就进行提示"""
import pyperclip, re # 需要剪贴板模块和正则模块
phoneRegex = re.compile(r'''(
(\d{3}|\(\d{3}\))? # 区号代表或354 (354)都是可以的, \d{3}是指三个数字,\( \)包含括号, ?表示可选,即这个不匹配也没关系
(\s|-|\.)? # 区号后面可能是空格、制表符,或者-,或者是.,也可能没有,所有有?
(\d{3}) # 匹配三个数字,必须有
(\s|-|\.) # 与第二行相同,但不是可选,必须有
(\d{4}) # 同第三行
(\s*(ext|x|ext\.|-)\s*(\d{2,5}))? # s*,代表不论有多少空格或制表符,后面跟的是ext 或 x 或 ext. 再后面跟的是
)''',re.VERBOSE)
nums = ['test1:my phone number is 544-866-4663',
'test1:my phone number is (544)866-4663',
'test2:my phone number is 544 866.4663-543222', #只设定了2到5个字符,因此匹配只能是54322
'test2:my phone number is 544-866.4663 x 5432',
'test3:my phone number is 132.866.4663 ext. 5432'
]
for phonenum in nums:
print(phonenum)
print(phoneRegex.search(phonenum))
print()
运行结果:
test1:my phone number is 544-866-4663
<_sre.SRE_Match object; span=(25, 37), match='544-866-4663'>
test1:my phone number is (544)866-4663
<_sre.SRE_Match object; span=(25, 38), match='(544)866-4663'>
test2:my phone number is 544 866.4663-543222
<_sre.SRE_Match object; span=(25, 43), match='544 866.4663-54322'>
test2:my phone number is 544-866.4663 x 5432
<_sre.SRE_Match object; span=(25, 44), match='544-866.4663 x 5432'>
test3:my phone number is 132.866.4663 ext. 5432
<_sre.SRE_Match object; span=(25, 47), match='132.866.4663 ext. 5432'>
练习2:
# 《python编程快速上手》p134, 7.15
# 项目:类似程序的几个设想
"""
eg1:查询网站
(http(s)?\:\/\/)? 匹配几种常用模式:1、http:// 2、https:// 3、没有http前缀
[a-zA-Z0-9_]+ 第一个字符必须为字母,至少一个
\. 加dot
(com|net|org|cc)+ 后缀假定必须是这几个之一,可以建立列表
*--------------------------------------------------------------------
eg2:规范日期比如3/14/2015,03-14-2015,2015/3/14
\d{1,2}(\/|\-|\.)\d{1,2}(\/|\-|\.)\d{4} 第一种和第二种
\d{4}(\/|\-|\.)\d{1,2}(\/|\-|\.)\d{1,2}
*--------------------------------------------------------------------
eg3: 删除敏感信息,比如信用卡号码,假定规则是9013 0233 4828 4900,中间可以用空格或者-
(\d{4}(-|\s)?){4}
删除使用sub('',.....)
*--------------------------------------------------------------------
eg4: 寻找单词多个空格(感叹号)
\s{2,},替换为''
"""
# eg1
import re
siteRe = re.compile(r'(http(s)?:\/\/)?'
r'(www\.)?([a-zA-Z0-9_]+)'
r'(\.)'
r'(com|net|org|cc)+')
testSite = "These sites are www.ever+yang.org http://everyang.org"
print(siteRe.findall(testSite))
# eg2
dateRe = re.compile(r'(\d{1,2})(\/|\-|\.)?(\d{1,2})(\/|\-|\.)?(\d{4})')
# 还可以写成 ((\d{1,2})(\/|\-|\.)?){2}(\d{4}) ,前面两个是一样的
# 第二种年度在前的,需要比照另外一个模式,因为在替换时需要不同位置处理
testDate = "今天是09/11/2017,教师节快乐!"
print("原文:" + testDate + '正则后')
print("#" +dateRe.sub(r'\1-\3-\5', testDate) + "\n")
# eg3
cardRe = re.compile(r'(\d{4}(-|\s)?){4}')
# 这个模式比较清楚,4个数字,后面可以是-或者空格或者不空,连续4组一样
testCard = "我的信用卡号是9013-02334828 4900,小心信息泄露"
print("原文:" + testCard+",正则后")
print("#" + cardRe.sub('*****',testCard) + "\n")
# eg4
blankRe = re.compile(r'!{2,}')
# {2,}是指包括2个!及以上的
testWords = "我喜欢你!!"
print("原文:" + testWords + "正则后")
print("#" +blankRe.sub('!', testWords) + "\n")
运行结果:
[('', '', '', 'yang', '.', 'org'), ('http://', '', '', 'everyang', '.', 'org')]
原文:今天是09/11/2017,教师节快乐!正则后
#今天是09-11-2017,教师节快乐!
原文:我的信用卡号是9013-02334828 4900,小心信息泄露,正则后
#我的信用卡号是*****,小心信息泄露
原文:我喜欢你!!正则后
#我喜欢你!
练习3
# 《python编程快速上手》p136,7.18.1
# 正则表达式实践:一个强口令,长度不少于8个字符,同时包含大写和小写字符,至少有1个数字。
import re
pswRegex = ['\w{8,}',
'[a-z].*[A-Z]',
'[0-9]+']
testPsws = ['k2ll92x2dd',
'u7Klssewx8',
'Ioo299;jf',
'-29ikdlLss',
'Dz382998819',
'Ykl28',
'Ldkdoodiws',
'#8dllspsDe']
for psw in testPsws:
flag = True
for aRegex in pswRegex:
if re.compile(aRegex).search(psw) == None:
flag = False
if flag:
print(psw + " 是强口令")
else:
print(psw + " 不符合强口令条件")
# 《python编程快速上手》p136,7,18.2
# 实践:实现strip(defWords='')的功能,如果没有参数,则删除两边空格;如有参数,则删除制定的字符
def simuStrip(originWords, defWords = ''):
if defWords == '':
partern = re.compile(r'^\s|\s$')
else:
partern = re.compile(defWords)
return partern.sub('',originWords)
print(simuStrip(' 我来这里了,前后留这两个空格 '))
print(simuStrip('I am here, kiss me',' me'))
print(simuStrip(' 我来这里了前后留这两个空格 ','来'))
# 博主自己加的练习项目20170912,正则表达式匹配汉字,要做人工智能或者文字识别可能需要用到的模型
# 项目:规范化一个表述,比如我明天去打球,把人物、时间、地点、行为找出
roles = ['我', '爸爸', '小明', '东东']
whenDo = ['今天', '明天', '以后', '未来', '大前天']
whereDo = ['家', '火车站', '路上', '学校', '商场', '体育馆']
whatDo = ['踢球', '写代码', '弹吉他', '看朋友', '喝茶']
items = [roles,whenDo,whereDo, whatDo]
def simuCompre(someWords):
result = ["","","",""]
i = 0
for item in items:
partern = re.compile('|'.join(item))
mo = partern.search(someWords)
if mo != None:
result[i] = mo.group(0)
i += 1
return result
print(simuCompre("明天我他妈的去火车站弹吉他"))
print(simuCompre("在体育馆踢球很帅,东东加油"))
运行结果:
k2ll92x2dd 不符合强口令条件
u7Klssewx8 是强口令
Ioo299;jf 不符合强口令条件
-29ikdlLss 是强口令
Dz382998819 不符合强口令条件
Ykl28 不符合强口令条件
Ldkdoodiws 不符合强口令条件
#8dllspsDe 是强口令
我来这里了,前后留这两个空格
I am here, kiss
我这里了前后留这两个空格
['我', '明天', '火车站', '弹吉他']
['东东', '', '体育馆', '踢球']
网友评论