实验4 字符串与正则表达式

实验4 字符串与正则表达式

1、编写程序实现输入月份数字输出对应的月份缩写字符串。月份缩写放在一个大字符串中:monts=“JanFebMarAprMayJunJulAugSepOctNovDec”

monts="JanFebMarAprMayJunJulAugSepOctNovDec"
n=input("请输入月份代表的数字:")
pos=(int(n)-1)*3
findmonth=monts[pos:pos+3]
print("月份的简写为:"+findmonth)

2、从键盘输入一批字符,按要求加密并输出。
加密规则:
(1)所有字母均转换为小写。
(2)若是字母’a’到’y’,则转化为下一个字母。
(3)若是’z’,则转化为’a’。
(4)其它字符,保持不变。

import string
str1=input('输入字符串:').lower()
before = string.ascii_lowercase
after = before[1:]+before[:1]
table=''.maketrans(before,after)
print(str1.translate(table))

3、编写程序,用户输入带有千分位逗号的数字字符串,然后输出不带千分位逗号的数字字符串,重复以上操作,如果输入字符串’0’则退出程序。

str1=input('输入数字字符串:')
while str1 !='0':
    print(''.join(str1.split(',')))
    str1=input('输入数字字符串:')

4、输入一个字符串,统计并输出该字符串中大写字母、小写字母、数字和其它字符的个数,重复以上操作,如果输入字符串’0’则退出程序。要求用两种方法实现:方法一循环遍历字符串统计(不用正则表达式),方法二用re模块的方法或正则表达式对象的方法。
法1

import string
capital = string.ascii_uppercase
lowerCase = string.ascii_lowercase
num = string.digits
symbol = string.punctuation
dict_1 = {'capital':0,'lowerCase':0,'num':0,'symbol':0}
str1 = input('输入字符串:')
while str1 != '0':
    for i in str1:
        if i in capital:
            dict_1['capital']=dict_1.get('capital')+1
        if i in lowerCase:
            dict_1['lowerCase']=dict_1.get('lowerCase')+1
        if i in num:
            dict_1['num']=dict_1.get('num')+1
        if i in symbol:
            dict_1['symbol']=dict_1.get('symbol')+1
    print(dict_1)
    str1 = input('输入字符串:')

法2

import string
import re
str1 = input('输入字符串:')
while str1 != '0':
    capital = re.findall(r'[A-Z]',str1)
    lowerCase = re.findall(r'[a-z]',str1)
    num = re.findall(r'\d{1}',str1)
    symbol = re.findall(r'[{}]'.format(string.punctuation),str1)
    print('大写字母:'+str(len(capital)))
    print('小写字母:'+str(len(lowerCase)))
    print('数字:'+str(len(num)))
    print('符号:'+str(len(symbol)))
    str1 = input('输入字符串:')

5、编程找出字符串’My friend Bill will pay the bill’中以’ill’结尾的单词,并显示出匹配的位置。

import re
str1 = 'My friend Bill will pay the bill'
a = re.finditer(r'\b\S*ill\b',str1)
for i in a:
    print(i.group(),i.span(),sep='的坐标')

6、处理一个单位的电话列表,取出其中的姓名和电话分机号码,并且将它们打印出来,其中电话列表如下:
s = ‘Dr.David Jone,Ophthalmology,x2441
Ms.Cindy Harriman,Registry,x6231
Mr.Chester Addams,Mortuary,x6231
Dr.Hawkeye Pierce,Surgery,x0986’
提取出其中的姓名和分机的结果如下所示:
2441 Jone
6231 Harriman
6231 Addams
0986 Pierce
要求分别用findall()方法和search()方法实现。
findall()

import re
s = '''Dr.David Jone,Ophthalmology,x2441
Ms.Cindy Harriman,Registry,x6231
Mr.Chester Addams,Mortuary,x6231
Dr.Hawkeye Pierce,Surgery,x0986'''
infomation = re.findall(r'\w{2}\.\w+ (\w+).+(\d{4})',s)
for i in infomation:
    print(i[1],end='\t')
    print(i[0])

search()

import re
s = '''Dr.David Jone,Ophthalmology,x2441
Ms.Cindy Harriman,Registry,x6231
Mr.Chester Addams,Mortuary,x6231
Dr.Hawkeye Pierce,Surgery,x0986'''
pattern = re.compile(r'\w{2}\.\w+ (\w+).+(\d{4})')
index = 0
while True:
    matchResult = pattern.search(s, index) #从指定位置开始匹配
    if not matchResult:    #匹配失败
        break
    print(matchResult.group(2),matchResult.group(1),sep='    ')
    index = matchResult.end()

7、编程检查输入的字符串密码是否符合要求,不符合要求时详细理由也一并输出。密码要求如下:
(1)密码长度8-20
(2)密码由英文字母,数字和特殊字符组成
(3)至少应包括两个数字
(4)应包括一个以上的大写字母
(5)特殊字符只能用(_?!)三个
检查规则的优先顺序是:

  • 长度检查
  • 英文字母检查
  • 数字检查
  • 大写字母检查
  • 特殊字符检查
  • 无效字符检查
    要求用两种方法实现:
    1、不用正则表达式编程实现
    2、用正则表达式编程实现

不使用re

while True:
    password = input('输入密码: ')
    shuZi_num = 0
    lower_num = 0
    upper_num = 0
    teShuZiFu_num = 0
    wuXiaoZiFu_num = 0
    if len(password) > 20 or len(password) < 8:
        print("密码无效:不超过8个字或超过20个字:")
        break
    for s in password:
        if s.isdigit():
            shuZi_num += 1
        elif s.islower():
            lower_num += 1
        elif s.isupper():
            upper_num += 1
        elif s == "_" or s == "?" or s == "!":
            teShuZiFu_num += 1
        else:
            wuXiaoZiFu_num += 1
    if lower_num <= 0 and upper_num <= 0:
        print( "密码无效:未包含英文字母")
        break
    if shuZi_num < 2:
        print( "密码无效:数字少于两个")
        break
    if upper_num < 1:
        print("密码无效:没有大写字母")
        break
    if wuXiaoZiFu_num > 0:
        print( "密码无效:包含无效字符")
        break
    if teShuZiFu_num <= 0:
        print("密码无效:未包含特殊文字")
        break
    else:
        print( "输入成功")
        break

使用re

import re

lowerRegex = re.compile('[a-z]')
upperRegex = re.compile('[A-Z]')
digitRegex = re.compile('[0-9]')
punctRegex = re.compile('[_?!]')
wrongRegex = re.compile('[^a-zA-Z0-9_?!]')

while True:
    password = input('请输入大于8位的包含大小写字母和数字的密码:')
    if 20 <len(password) < 8:
        print('输入的密码不在8-20位')
    elif lowerRegex.search(password) == None:
        print('未包含小写字母')
    elif upperRegex.search(password) ==None:
        print('应包括一个以上的大写字母')
    elif len(digitRegex.findall(password)) < 2:
        print('至少应包括两个数字')
    elif punctRegex.search(password) == None:
        print('没有输入特殊符号')
    elif wrongRegex.search(password) != None:
        print('包含无效字符')
    else:
        print('输入成功')
        break
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值