昨天晚上把正则表达式的知识点梳理了一遍,今天把一些课后习题拿出来记录一下:
import re ''' 如何写一个正则表达式,匹配3位数就有一个逗号的数字? 它必须匹配以下数字: '42' '1,234' '6,368,745' 但不会匹配: '12,34,567' '1234' 这里写的正则表达式肯定算不上精巧,但实实在在可以匹配上述要求 第一次写的时候就想直接写出来满足例子的表达式,可是没能成功 后面分析之后发现大致是如下结构: 1,234,567 1,234 12,345,678 12,345 123,456 看得出来的是当数字只有1-3位时不需要逗号,所以(\d{1,3}) 数字是4-6位时(\d{1,3},\d{3}) 数字是7-9位时(\d{1,3},\d{3},\d{3}) 按顺序写下来发现长字符串匹配过后只剩下一截 回去差错:前面一篇博客我说过管道匹配多个分组时,优先返回匹配的第一个 所以把长字符串匹配放在前面,从逻辑上来讲是没有问题的,因为短字符串不可能与第一个表达式匹配 所以一定会继续尝试匹配第二个、第三个表达式 这个时候在测试一遍发现1234这种字符也会匹配最后一个表达式,试错法告诉我们 如果字符串长度在1-3之间那么这个字符串后面应该接的是空格所以加上空格之后继续测验 发现此时'42'这个字符串匹配出现错误 嗯 再来检查一遍,是了,我们需要如果字符串1-3位那么它就只有这么长也就是要以此字符(数字)结尾$ 同样的加上开头起始匹配^即可满足以上所有测试, ''' flRegex = re.compile(r'(^\d{1,3},\d{3},\d{3}$)|(^\d{1,3},\d{3}$)|(^\d{1,3}$)') s2 = '1,234' s1 = '42' s3 = '6,368,745' s4 = '12,34,567' s5 = '1234' mo = flRegex.search(s2) print(mo.group())
如何写一个正则表达式,匹配姓Nakamoto的完整姓名? 你可以假定名字总是出现在姓前面是一个大写字母开头的单词。 该正则表达式必须匹配: 'Satoshi Nakamoto' 'Alice Nakamoto' 'RoboCop Nakamoto' 但不匹配: 'satoshi Nakamoto' 'Mr.Nakatomo' 'Nakatomo' 'Satoshi nakatomo' 这次将要测试的例子存入列表中,在测试时只用修改下标就可以了 有上一题的基础这一次可以很轻松的写出正则表达式了 如果放进循环那么将无法测试第五个与第六个例子 ''' names =['Satoshi Nakamoto','Alice Nakamoto','RoboCop Nakamoto','satoshi Nakamoto','Mr.Nakatomo','Satoshi nakatomo'] nameRegex = re.compile(r'^[A-Z][a-zA-Z]* (Nakamoto)$') for i in range(6):#放进循环则无法检测第五第六个例子 name = nameRegex.search(names[2]) print(name.group())
如何编写一个正则表达式匹配一个句子,它的第一个词是Alice 、Bob或 Carol 第二个词是eats 、 pets、throws。第三个词是apples、cats、baseballs 这句话以句点结束,此正则表达式不区分大小写。 它必须匹配: 'Alice eats apples.' 'Bob pets cats.' 'Carol throws Apples.' 'BOB EATS CATS.' 但不匹配: 'RoboCop eats apples.' 'ALICE THROWS FOOTBALLS.' 'Carol eats 7 cats.' ''' sents =['Alice eats apples.','Bob pets cats.','Carol throws Apples.' ,'BOB EATS CATS.','RoboCop eats apples.', 'ALICE THROWS FOOTBALLS.','Carol eats 7cats.'] sentRegex =re.compile(r'^(alice |bob |carol )(eats |pets |throws )(apples|cats|baseballs).$',re.I) for i in range(6): sent = sentRegex.search(sents[i]) print(sent.group())
强口令检测:写一个函数,它使用正则表达式,确保传入的口令字符是强口令 强口令的定义是:长度不少于8个字符,同时应包含大写和小写字符,至少有一位是数字 你可以使用多个正则表达式来测试该字符串,以保证它的强度 思路:这个时候需要我们创建自己的字符分类,也就是使用[] 像以前一样,对Regex对象使用search()方法,可以确保输入的str满足,这个验证条件 如果满足强口令的所有验证条件那么就打印'设置强口令成功' ''' def detect(str): if len(str)>8: psdRegex1 = re.compile(r'[A-Z]') psdRegex2 = re.compile(r'[a-z]') psdRegex3 = re.compile(r'[0-9]') if psdRegex1.search(str) == None: print("你的密码中没有大写字符!") if psdRegex2.search(str) == None: print("你的密码中没有小写字符!") if psdRegex3.search(str) ==None: print("你的密码中没有数字") else: print("设置强口令成功!") else : print("你输入的密码长度太短!") str = input("请输入你的密码,请务必保证你的密码是强密码:") detect(str)
''' strip()的正则表达式版本 写一个函数,它接受一个字符串,做的事与strip()字符串方法一样。 如果仅仅传入一个字符串,那么则将这个字符串首尾的空格去除(如果有的话) 若传入两个参数,第二个参数指定删除该字符串中存在的字符 ''' def stripE(str,char =None): if char is None: stripReg = re.compile('^ *| *$') else : stripReg = re.compile('[' + char + ']*|[' +char + ']*') return stripReg.sub('',str) strs = ['sadaddaa',' aqweqeqw '] text = stripE(strs[0],'a') print(text)