美文网首页
python 正则表达式操作

python 正则表达式操作

作者: caokai001 | 来源:发表于2019-05-05 14:08 被阅读0次
    正则表达式

    练习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

    相关文章

      网友评论

          本文标题:python 正则表达式操作

          本文链接:https://www.haomeiwen.com/subject/iencoqtx.html