<jupyter_start><jupyter_text>1.任务描述：合法的IPv4地址由4组数字组成，每组数字之间以.分隔，且取值范围是0-255。请在下列数字中判断出合法的地址。  输入：66666666666  23333333  500.1.2.5  0.0.0.0  192.0.0.1  172.16.58.3  172.16.58.3<jupyter_code>'''
首先分析一下ip地址的组成：
    前三个单元由1~255的数字+'.'构成，最后一个单元由1~255数字构成。
    1~255的数字的特点：
        两位以下：[1-9]?\d
        三位：
            100-199：1\d{2}
            200-249：2[0-4]\d
            250-255：25[0-5]
'''
import re

pattern = r'(((25[0-5]|2[0-4]\d|1\d{2})|([1-9]?\d))\.){3}((25[0-5]|2[0-4]\d|1\d{2})|([1-9]?\d))$'
ip = input("请输入一个ip地址：")
result = re.match(pattern, ip)
if result:
    print("Valid IP Address")
else:
    print("Invalid IP Address")<jupyter_output>请输入一个ip地址：500.1.2.5
Invalid IP Address<jupyter_text>2.任务描述：将句子中的中文日期替换为阿拉伯数字，并改为YYYY-MM-DD格式输出。  输入：新中国于一九四九年十月一日成立。  我的出生日期是二零零零年九月二十三日。<jupyter_code>'''
首先分析一下日期的组成：
    年：年字前的四位是对应的年数。直接按位解析为阿拉伯数字即可。
    月：年字和月字中间的一到二位是对应的月数。
        一位：一到十月，直接按位解析为阿拉伯数字。
        两位：十一到十二月，读取末位并加前缀'1'即可。
    日：月字和日字中间的一到三位是对应的日数。
        一位：一到十日，直接读取。
        两位：十一到十九日、二十日、三十日，读首位，如为十则读末位加前缀'1'，如非十则首位加后缀'0'。
        三位：二十一到二十九、三十一，首位加末位。
'''

import re

#用字典记录汉字-阿拉伯数字的映射关系
nums = {'零':'0','一': '1','二': '2','三': '3','四': '4','五': '5','六': '6','七': '7','八': '8','九': '9','十': '10'}

#记录年、月、日的匹配规则
pattern_year = '.{4}(?=年)'
pattern_month = '(?<=年).*(?=月)'
pattern_day = '(?<=月).*(?=日)'

sentence = input("请输入句子：")

res_year = re.search(pattern_year, sentence)
res_month = re.search(pattern_month,sentence)
res_day = re.search(pattern_day,sentence)

str_year="";str_month="";str_day=""

if res_year and res_month and res_day:
    #将年份处理为阿拉伯数字
    for i in range(4):
        str_year+=nums[(res_year.group())[i]]
    #将月份处理为阿拉伯数字
    if len(res_month.group()) == 1:
        str_month = nums[(res_month.group())[0]]
    elif len(res_month.group()) == 2:
        str_month = '1'+nums[(res_month.group())[1]]
    #将日期处理为阿拉伯数字
    if len(res_day.group()) == 1:
        str_day = nums[(res_day.group())[0]]
    elif len(res_day.group()) == 2:
        if res_day.group()[0] == '十':
            str_day = '1'+nums[(res_day.group())[1]]
        else:
            str_day = nums[(res_day.group())[0]]+'0'
    elif len(res_day.group()) == 3:
        str_day = nums[(res_day.group())[0]]+nums[(res_day.group())[2]]
    #将原句中的日期替换并格式化
    sentence = sentence.replace(res_year.group()+'年',str_year+'-')
    sentence = sentence.replace(res_month.group()+'月',str_month+'-')
    sentence = sentence.replace(res_day.group()+'日',str_day)
    print(sentence)<jupyter_output>请输入句子：我的出生日期是二零零零年九月二十三日。
我的出生日期是2000-9-23。<jupyter_text>3.任务描述：将句子中的电话号码提取出来，电话号码格式为区号（可选）后接“-”或空格，再加十位数字。  输入：我的电话号码是1234567890，另一个电话号码是+86-4321567890。如果以上都不可用，您可以在16点前致电+91 5645456545与我联系。<jupyter_code>'''
电话号码组成：
    有区号：'+'加n位数字加' '或者'-'加10位数字
    无区号：10位数字
'''

import re

pattern = '((\+\d*[ -])?\d{10})'

sentence = input("请输入句子：")

res = re.findall(pattern, sentence)

for i in range(len(res)):
    print(res[i][0])<jupyter_output>请输入句子：我的电话号码是1234567890，另一个电话号码是+86-4321567890。如果以上都不可用，您可以在16点前致电+91 5645456545与我联系。
1234567890
+86-4321567890
+91 5645456545
{'fraction_non_alphanumeric': 0.20994113799869196, 'fraction_numerical': 0.09254414650098103, 'mean_word_length': 4.329268292682927, 'pattern_counts': {'":': 0, '<': 12, '<?xml version=': 0, '>': 10, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 6, 'substrings_counts': 2, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '159508', 'license': 'MIT', 'n_tokens_mistral': 1876, 'n_tokens_neox': 1877, 'n_words': 160, 'path': 'assignment1_regular-expression/Regex.ipynb', 'repo_name': 'Hairaa-1026/2020-Autumn-Natural-Language-Processing', 'size': '3062'}