python 正则表达式操作

2019-05-05  本文已影响0人  caokai001
正则表达式

练习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
 我这里了前后留这两个空格 
['我', '明天', '火车站', '弹吉他']
['东东', '', '体育馆', '踢球']

参考1
参考2

上一篇下一篇

猜你喜欢

热点阅读