PTA_Python程序控制结构

前十题都简单,略过...

7-11 身份证号判断性别与出生日期
15位居民身份证号码是由15位得数字组成,排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码(年份月份日期都是两位),三位数字顺序码。三位数字顺序码男性使用1、3、5、7、9等奇数,女性使用2、4、6、8、0等偶数。
18位居民身份证号码排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码(男性使用1、3、5、7、9等奇数,女性使用2、4、6、8、0等偶数)和一位数字校验码。

身份证号码可以用正则表达式判断是否合法,也可以用字符串判断来判断。

从键盘输入一串15位 或18位的字符串。
首先判断该字符串中表示日期的字符串是否符合日期字符串,若不符合则给出提示。

例如  输入:3501021990229403X,  则输出:Error,日期不合法

若日期合法则认为该字符符合中国的居民身份证编码(本题假设除了日期有可能输错,其他不会输错)

若输入字符是15位符合中国的居民身份证编码,则输出性别 与 以类似于“1990年10月01日”的形式的出生日期。

例如:输入350102901001402,则输出:女,1990年10月01日

若输入字符是18位符合中国的居民身份证编码,则输出性别 与 以类似于“2000年10月01日”的形式的出生日期。

例如:输入35010220001001403X,则输出:男,2000年10月01日

#Code:(这里易错点在于15位的年份只有两位,输出时要+1900)
import re
from datetime import datetime

def check_id_card(id_card):
    if len(id_card) == 15:
        pattern = r'^\d{6}(\d{2})(\d{2})(\d{2})(\d{3})$'
    elif len(id_card) == 18:
        pattern = r'^\d{6}(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$'

    match = re.match(pattern, id_card)

    year, month, day = int(match.group(1)), int(match.group(2)), int(match.group(3))
    try:
        if len(id_card) == 15:
            year = year + 1900
            birthdate = datetime(year, month, day)
        elif len(id_card) == 18:
            birthdate = datetime(year, month, day)
    except ValueError:
        return "Error,日期不合法"

    gender_code = match.group(4)
    gender = "男" if int(gender_code) % 2 == 1 else "女"
    formatted_birthdate = birthdate.strftime("%Y年%m月%d日")

    return f"{gender},{formatted_birthdate}"

input_id_card = input()
print(check_id_card(input_id_card))
7-12 输出列表中的数值型元素个数
本题目要求读入一个由任意类型元素组成的列表,统计并输出列表中数值类型(包括int类型,float类型, complex类型)元素的个数。不计算嵌套元素中的数据。

输入格式:
输入一个由任意类型元素组成的列表。

输出格式:
输出列表中的数值类型元素的个数,包括int类型,float类型和complex类型。

输入样例:
["Python", 10, 20, "Java", 3 + 4j, False, 2.17, (10, 20)]

输出样例:
4

#Code:(如果值为bool类型也会判定为+1,要增加判断条件,虽然不知道为什么...)
def count_numerical_elements(lst):
    count = 0
    for item in lst:
        if isinstance(item, (int, float, complex)) and not isinstance(item, bool):
            count += 1
    return count

#用eval()方法将字符串转为数组
lst = eval(input())
print(count_numerical_elements(lst))

7-13 把字符串中十六进制字符转换成十进制整数
输入一个字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。如果没有十六进制字符,不输出任何信息;-0和0都输出为0。

输入格式:
输入一行非空字符串。

输出格式:
在一行中输出转换后的十进制数,或没有任何输出。

输入样例1:
+-P-xf4+-1!
输出样例1:
-3905

输入样例2:
+-nn*)+-lp
输出样例2:
(这里是指输出为空)

#Code:
import re
def hex_to_decimal(hex_str):
    # 过滤掉非十六进制字符并转换为小写
    # 要准备两个来分别进行是否存在十六进制字符以及是否为负数的判断
    filtered_hex = re.sub(r'[^0-9a-fA-F-]', '', hex_str).lower()
    filtered_hex2 = re.sub(r'[^0-9a-fA-F]', '', hex_str).lower()
    
    # 如果字符串为空,则返回空
    if not filtered_hex2:
        return ""
    
    # 判断是否为负数
    is_negative = False
    if filtered_hex[0] == '-':
        is_negative = True
        filtered_hex = filtered_hex = re.sub(r'[^0-9a-fA-F]', '', filtered_hex)
    
    # 将十六进制字符串转换为十进制整数
    decimal_number = int(filtered_hex, 16)
    
    # 如果原字符串表示的是负数,则取其相反数
    if is_negative:
        decimal_number = -decimal_number
    
    return decimal_number

s = input()
print(hex_to_decimal(s))

7-14 利用正则表达式得到一段HTML文本中所有超链接对应的网址
编写程序实现以下功能:利用正则表达式得到一段HTML文本中所有超链接对应的网址,并将网址输出到屏幕上(每行输出一个网址)。

输入格式:
从键盘输入 一段HTML文本,多行输入,空行输入 结束。

输出格式:
输出从HTML文本中提取到的超链接所对应的网址,一行一个网址。

输入样例:
<h3 class="c-title">
 <a href="https://baijiahao.baidu.com/s?id=1633289774665320636&amp;wfr=spider&amp;for=pc" data-click="{
      'f0':'77A717EA',
      'f1':'9F63F1E4',
      'f2':'4CA6DE6E',
      'f3':'54E5243F',
      't':'1557660267'
      }" target="_blank">
      影片《周恩来回延安》在<em>南开大学</em>点映开启全国路演
    </a>
</h3>
<a href="https://baijiahao.baidu.com/s?id=1632116753423885280&amp;wfr=spider&amp;for=pc" data-click="{
      'f0':'77A717EA',
      'f1':'9F73F1E4',
      'f2':'4CA6DE6E',
      'f3':'54E5243F',
      't':'1557660267'
      }" target="_blank">
      天津“<em>南开大学</em>”——莘莘学子的梦想之地
    </a>
        
输出样例:
https://baijiahao.baidu.com/s?id=1633289774665320636&amp;wfr=spider&amp;for=pc
https://baijiahao.baidu.com/s?id=1632116753423885280&amp;wfr=spider&amp;for=pc

#Code:(主要在于输入为多行,要利用while读取所有内容再进行匹配)
import re

html_lines = []
while True:
    try:
        line = input()
        if not line.strip():  # 检查输入是否为空行
            break
        html_lines.append(line)
    except EOFError:
        break

# 定义正则表达式模式,匹配href属性值
pattern = r'href=[\'"]?([^\'" >]+)'

# 使用findall方法查找所有匹配的网址
html_text = ''.join(html_lines)
urls = re.findall(pattern, html_text)

# 输出结果
for url in urls:
    print(url)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值