自学内容网 自学内容网

强大的正则表达式——Easy


进入题目界面输入难度1后,让我们输入正则表达式(regex):


目前不清楚题目要求,先去下载附件查看情况:

import re
import random

# pip install libscrc
import libscrc

allowed_chars = "0123456789()|*"
max_len = 1000000
num_tests = 300

difficulty = int(input("Enter difficulty level (1~3): "))
if difficulty not in [1, 2, 3]:
    raise ValueError("Invalid difficulty level")

regex_string = input("Enter your regex: ").strip()

if len(regex_string) > max_len:
    raise ValueError("Regex string too long")

if not all(c in allowed_chars for c in regex_string):
    raise ValueError("Invalid character in regex string")

regex = re.compile(regex_string)

for i in range(num_tests):
    expected_result = (i % 2 == 0)
    while True:
        t = random.randint(0, 2**64)  # random number for testing
        if difficulty == 1:
            test_string = str(t)  # decimal
            if (t % 16 == 0) == expected_result:  # mod 16
                break
        elif difficulty == 2:
            test_string = bin(t)[2:]  # binary
            if (t % 13 == 0) == expected_result:  # mod 13
                break
        elif difficulty == 3:
            test_string = str(t)  # decimal
            if (libscrc.gsm3(test_string.encode()) == 0) == expected_result:  # crc
                break
        else:
            raise ValueError("Invalid difficulty level")
    regex_result = bool(regex.fullmatch(test_string))
    if regex_result == expected_result:
        print("Pass", test_string, regex_result, expected_result)
    else:
        print("Fail", test_string, regex_result, expected_result)
        raise RuntimeError("Failed")

print(open(f"flag{difficulty}").read())

丢给ai分析一下:

1、定义常量:

allowed_chars:允许在正则表达式中使用的字符(0123456789()|*)。

max_len:正则表达式的最大长度(1000000个字符)。

num_tests:测试次数(300次)。


2、获取用户输入:

用户输入难度级别(1、2 或 3)。

用户输入正则表达式字符串。


3、验证正则表达式:

检查正则表达式字符串的长度是否超过最大限制。

检查正则表达式字符串中是否包含不允许的字符。

编译正则表达式。


4、生成测试用例并验证:

循环生成 num_tests 次测试用例。

根据难度级别生成不同的测试字符串:

难度 1:生成一个十进制数,检查其是否能被16整除。

难度 2:生成一个二进制数,检查其是否能被13整除。

难度 3:生成一个十进制数,检查其CRC校验码是否为0。

使用正则表达式匹配测试字符串,并与预期结果进行比较。

如果匹配结果与预期结果一致,打印“Pass”;否则,打印“Fail”并抛出异常。


5、读取并显示标志文件:


这下看懂了,难度1就是写一个正则表达式,要求能够匹配以能被16整除的四位数结尾的十进制数,其中正则表达式允许的字符包括数字(0-9)、括号(())、竖线(|)和星号(*),且正则表达式的长度不能超过最大限制(1000000字符),继续让AI写个python代码来生成一个满足要求的正则表达式:

def generate_divisible_by_16_regex():
    # 生成一个正则表达式,匹配以能被16整除的四位数结尾的十进制数
    string = ""
    for i in range(9999, -1, -1):
        if i % 16 == 0:
            string += f"{i:04d}|"
    
    # 去掉最后一个多余的竖线
    string = string[:-1]
    
    # 构建正则表达式
    regex = f"(0|1|2|3|4|5|6|7|8|9)*({string})"
    
    # 检查正则表达式的长度
    if len(regex) > 1000000:
        raise ValueError("生成的正则表达式超过了1000000字符的最大限制。")
    
    return regex

# 生成正则表达式
divisible_by_16_regex = generate_divisible_by_16_regex()
print(f"生成的正则表达式: {divisible_by_16_regex}")

得到的正则表达式:

(0|1|2|3|4|5|6|7|8|9)*(9984|9968|9952|9936|9920|9904|9888|9872|9856|9840|9824|9808|9792|9776|9760|9744|9728|9712|9696|9680|9664|9648|9632|9616|9600|9584|9568|9552|9536|9520|9504|9488|9472|9456|9440|9424|9408|9392|9376|9360|9344|9328|9312|9296|9280|9264|9248|9232|9216|9200|9184|9168|9152|9136|9120|9104|9088|9072|9056|9040|9024|9008|8992|8976|8960|8944|8928|8912|8896|8880|8864|8848|8832|8816|8800|8784|8768|8752|8736|8720|8704|8688|8672|8656|8640|8624|8608|8592|8576|8560|8544|8528|8512|8496|8480|8464|8448|8432|8416|8400|8384|8368|8352|8336|8320|8304|8288|8272|8256|8240|8224|8208|8192|8176|8160|8144|8128|8112|8096|8080|8064|8048|8032|8016|8000|7984|7968|7952|7936|7920|7904|7888|7872|7856|7840|7824|7808|7792|7776|7760|7744|7728|7712|7696|7680|7664|7648|7632|7616|7600|7584|7568|7552|7536|7520|7504|7488|7472|7456|7440|7424|7408|7392|7376|7360|7344|7328|7312|7296|7280|7264|7248|7232|7216|7200|7184|7168|7152|7136|7120|7104|7088|7072|7056|7040|7024|7008|6992|6976|6960|6944|6928|6912|6896|6880|6864|6848|6832|6816|6800|6784|6768|6752|6736|6720|6704|6688|6672|6656|6640|6624|6608|6592|6576|6560|6544|6528|6512|6496|6480|6464|6448|6432|6416|6400|6384|6368|6352|6336|6320|6304|6288|6272|6256|6240|6224|6208|6192|6176|6160|6144|6128|6112|6096|6080|6064|6048|6032|6016|6000|5984|5968|5952|5936|5920|5904|5888|5872|5856|5840|5824|5808|5792|5776|5760|5744|5728|5712|5696|5680|5664|5648|5632|5616|5600|5584|5568|5552|5536|5520|5504|5488|5472|5456|5440|5424|5408|5392|5376|5360|5344|5328|5312|5296|5280|5264|5248|5232|5216|5200|5184|5168|5152|5136|5120|5104|5088|5072|5056|5040|5024|5008|4992|4976|4960|4944|4928|4912|4896|4880|4864|4848|4832|4816|4800|4784|4768|4752|4736|4720|4704|4688|4672|4656|4640|4624|4608|4592|4576|4560|4544|4528|4512|4496|4480|4464|4448|4432|4416|4400|4384|4368|4352|4336|4320|4304|4288|4272|4256|4240|4224|4208|4192|4176|4160|4144|4128|4112|4096|4080|4064|4048|4032|4016|4000|3984|3968|3952|3936|3920|3904|3888|3872|3856|3840|3824|3808|3792|3776|3760|3744|3728|3712|3696|3680|3664|3648|3632|3616|3600|3584|3568|3552|3536|3520|3504|3488|3472|3456|3440|3424|3408|3392|3376|3360|3344|3328|3312|3296|3280|3264|3248|3232|3216|3200|3184|3168|3152|3136|3120|3104|3088|3072|3056|3040|3024|3008|2992|2976|2960|2944|2928|2912|2896|2880|2864|2848|2832|2816|2800|2784|2768|2752|2736|2720|2704|2688|2672|2656|2640|2624|2608|2592|2576|2560|2544|2528|2512|2496|2480|2464|2448|2432|2416|2400|2384|2368|2352|2336|2320|2304|2288|2272|2256|2240|2224|2208|2192|2176|2160|2144|2128|2112|2096|2080|2064|2048|2032|2016|2000|1984|1968|1952|1936|1920|1904|1888|1872|1856|1840|1824|1808|1792|1776|1760|1744|1728|1712|1696|1680|1664|1648|1632|1616|1600|1584|1568|1552|1536|1520|1504|1488|1472|1456|1440|1424|1408|1392|1376|1360|1344|1328|1312|1296|1280|1264|1248|1232|1216|1200|1184|1168|1152|1136|1120|1104|1088|1072|1056|1040|1024|1008|0992|0976|0960|0944|0928|0912|0896|0880|0864|0848|0832|0816|0800|0784|0768|0752|0736|0720|0704|0688|0672|0656|0640|0624|0608|0592|0576|0560|0544|0528|0512|0496|0480|0464|0448|0432|0416|0400|0384|0368|0352|0336|0320|0304|0288|0272|0256|0240|0224|0208|0192|0176|0160|0144|0128|0112|0096|0080|0064|0048|0032|0016|0000)


输入难度1再输入得到的正则表达式:

成功得到flag


原文地址:https://blog.csdn.net/weixin_73049307/article/details/143840370

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!