验证字符串是否为有效正则表达式?

0 投票
1 回答
1946 浏览
提问于 2025-04-17 21:49

编辑:我不能使用Python的're'模块。

这是一个作业,所以我不想要代码答案,只想要一些正确方向的建议。

我正在尝试编写一个函数,如果字符串s是一个有效的正则表达式,就返回True。

Examples of valid regex:
       '0'
       '1'
       '2'
       'e'
       '0*' etc..
       '(0*.1*)'
       '((0.1).2)' 

        '(0|1)'

一般规则是,如果r1和r2都是有效的正则表达式,那么'(' + r1 + '有效符号'(可以是|或者.)+ 'r2' + ')'也是有效的。

我想让它通过递归的方式逐部分检查字符串,但我不知道怎么才能做到这一点。我在这上面花了太多时间,想知道是否能得到一些帮助。

我会把我的代码贴出来,但它真的没有按我想要的方式工作。大部分只是我写下的想法。打印语句只是为了让我在调用时知道发生了什么。

def check_regex(s):
    values = ['0', '1', '2', 'e'] 
    symbols = ['|', '*', '.']

    return (all([i in values if len(i) == 1 else 
                     i[0] in values and i[1] == '*' if len(i) == 2 else 
                     #check_regex([i[0], i[2]]) if len(i) == 3 else 
                     #check_regex([i[0:2], i[3:]]) if len(i) == 5 else
                    False for i in s])) 

def is_regex(s):
    bool_list = []
    symbols = ['|', '.']  

    if s.startswith('('):
        for i in range(len(s)):
            if s[i] in symbols: 
                r1 = s[1:i]
                r2 = s[i + 1:s.find(')', i)]
                #if r1.startswith('('):
                    #r1 = r1[1:]
                    #if r1.endswith(')'):
                        #r1 = r1[:-1]

                print('r1: {} r2: {}'.format(r1, r2))
                bool_list += [check_regex([r1,r2])]
                #bool_list += [is_regex(r1)]
                #bool_list += [is_regex(r2)]
    else: 
        bool_list += [check_regex([s])]

    print(bool_list)
    return all(bool_list)

1 个回答

1

我个人觉得可以用一种更简单的方法来做这件事……

def check_regex(s):
    try: re.compile(s)
    except Exception: return False
    return True

基本上,这就是一种叫做 EAFP 的方式。尝试把它当作正则表达式来编译。如果出现错误,就返回 False。否则,就返回 True

撰写回答