Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用管道连接一组正则表达式时出现正则表达式模块错误_Python_Regex - Fatal编程技术网

Python 使用管道连接一组正则表达式时出现正则表达式模块错误

Python 使用管道连接一组正则表达式时出现正则表达式模块错误,python,regex,Python,Regex,为了提高性能,我尝试使用管道将一组正则表达式转换为一个正则表达式 self.regexes_token = [ {'descricao':'site www.', 'regex': r'^www\.(.+?)$'}, {'descricao':'apenas pontuacao','regex':r'^[[:punct:]]+?$'}, {'descricao':'palavra com sin

为了提高性能,我尝试使用管道将一组正则表达式转换为一个正则表达式

   self.regexes_token = [
                {'descricao':'site www.', 'regex': r'^www\.(.+?)$'},
                {'descricao':'apenas pontuacao','regex':r'^[[:punct:]]+?$'},
                {'descricao':'palavra com sinal negativo', 'regex': r'^(-)(.*?)$', 'grupo': r'\2'},
                {'descricao':'pronomes e títulos', 'regex': r'^(sra?|exm[º|°|o]|dr[a|ª]?|(v\.)?ex\.?(a|ª)\.?)\.??$'},
                {'descricao':'oab sigla', 'regex': r'^oab\/[a-z]{2}$'},
                {'descricao':'termos irrelevantes', 'regex': r'^(s\/n|e\/ou|e-?mail|cep|rj|tel\.?(\/fax|efone)?|anos?|rua|cpf|www)\.?$'},
                {'descricao':'chassi (VIN)', 'regex': r'^[A-Za-z0-9]{1}[A-Za-z]{2}[A-Za-z0-9]{9}[\d+]{5}$'},
                {'descricao':'data_br', 'regex': r'^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$'},
                {'descricao':'um char e ponto', 'regex': r'^\w[[:punct:]]$'},
                {'descricao':'rg','regex': r'^\d{2}\.\d{3}\.\d{3}-\d(\/.*)?'},
                {'descricao':'unidades de medidas', 'regex': r'^(\d{1,2},?x?)+(cm|m(l|²|2|m)?|k(g|m))$'},
                {'descricao':'zero seguido de qualquer coisa', 'regex': r'^0(.*)$'},
                {'descricao':'::punct:: seguido de qualquer coisa','regex':r'^[[:punct:]](.+?)$'},
                {'descricao':'telefone avulso', 'regex': r'^\d{4,5}-\d{4}$'},
                {'descricao':'ano', 'regex': r'\b(19|20)\d{2}\.?\b'},
                {'descricao':'contém char especial', 'regex': r'^.*?(~|\^|¿|¡|>|<|»|#|£|\?|»|·|#|\*|=|\+|¥|€|\||µ|®)+.*?$'}
            ]
            
            
            self.regexes_token_union = r'('+'|'.join([d['regex'] for d in self.regexes_token])+r')'
            print(self.regexes_token_union)
我用notepad++查看了“col”的位置,但即使这样,我也无法检测到这是什么打开的组

“令人困惑的事情”是,当我在循环上运行每个正则表达式时,它工作得很好(但性能不好)


那么,如何解决这个问题呢?

这里的基本错误是,当您将正则表达式与
|
组合时,组运算符
\2
将不会引用表达式中试图引用它的第二个组,而是引用组合正则表达式中带括号的第二个组

部分修复方法是在任何地方使用非分组括号,除非您确实需要引用回一个组。更好的解决方法是在需要命名组的地方定义它们,这样您就可以按名称而不是按编号引用它们

实际的错误消息试图在

r'^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1...
您不能使用
\1
,因为以第一个开括号开头的组尚未定义,因为我们还没有看到它的右括号。第一个组是从
r'(“+”|“.join(…)+r')”
开始的,因此您必须至少对其重新编号,以匹配组合正则表达式的编号,但同样,这几乎是不可维护的,并且很容易用命名组避免(至少在某种程度上是这样;如果您有很多命名组,那么跟踪名称冲突等也会成为一个问题)

可能您正试图返回到捕获的日期分隔符?如果是,请尝试

r'^(?:(?:31(?P<sep>[-/.])(?:0?[13578]|1[02]))(?P=sep)...
实际上不需要在联合表达式周围使用括号;它们不会添加任何内容

还请注意,在命名相应的组之后,我如何将
'grupo':r'\2'
替换为
'grupo':'palavra'
——显然需要修改代码,该代码尝试使用该组,而不是通过退出命名的组

在单个代码块中嵌入这样长而复杂的正则表达式确实是不可维护的。我没有尝试进一步重构代码,因为我并不假装理解它;但作为一个开始,您可能希望拆分庞大的正则表达式并将其拆分为几行,如

                {'descricao':'data_br',
                 'regex': r'(?:(?:31(?P<sep>/|-|\.)(?:0?[13578]|1[02]))(?P=sep)|'
                          r'(?:(?:29|30)(?P<sep2>/|-|\.)(?:0?[1,3-9]|1[0-2])(?P=sep2)))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|'
                          r'^(?:29(?P<sep3>/|-|\.)0?2(?P=sep3)(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|'
                          r'(?:(?:16|[2468][048]|[3579][26])00))))|(?:0?[1-9]|1\d|2[0-8])(?P<sep4>/|-|\.)'
                          r'(?:(?:0?[1-9])|(?:1[0-2]))(?P=sep4)(?:(?:1[6-9]|[2-9]\d)?\d{2})$'
                },
{'descripcao':'data\u br',
“regex”:r'(?:(?:31(?P/?-?\)(?:0?[13578]| 1[02])(?P=sep)|”
r’(?:(?:29 | 30)(?:P/|-|\)(?:0?[1,3-9]| 1[0-2])(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})$'
r'^(:29(?P/)-| \)0?2(?P=sep3)(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])
r’(?:(?:16 |[2468][048]|[3579][26])))(r’(?:0 |[1-9]|[1-d | 2[0-8])(?P/|-| \)
r’(?:(?:0?[1-9])|(?:1[0-2]))(?:(?:1[6-9]|[2-9]\d);\d{2})$”
},

更好的方法是,使用
re.X
标志,并在几行上编写带有嵌入注释的正则表达式。

注意,正则表达式中的反向引用在生成的大正则表达式中被弄乱了。尝试隔离问题。对前3个表达式进行并集,然后对前4个表达式进行并集,直到出现错误。这至少应该是正确的下面是给你带来麻烦的表达式。值得一提的是,你会在stock
re
中遇到同样的错误;但是你真的应该把你的代码转换成a,这样我们就不必猜测你是如何编译正则表达式的。
ano
末尾的
\b
可能也没有做你希望做的事情,但是有太多的错误我已经在这里了--我真的希望你更新你的问题,把重点放在这个问题上,并回顾一下,以寻求进一步的帮助。
r'^(?:(?:31(?P<sep>[-/.])(?:0?[13578]|1[02]))(?P=sep)...
                {'descricao':'data_br',
                 'regex': r'(?:(?:31(?P<sep>/|-|\.)(?:0?[13578]|1[02]))(?P=sep)|'
                          r'(?:(?:29|30)(?P<sep2>/|-|\.)(?:0?[1,3-9]|1[0-2])(?P=sep2)))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|'
                          r'^(?:29(?P<sep3>/|-|\.)0?2(?P=sep3)(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|'
                          r'(?:(?:16|[2468][048]|[3579][26])00))))|(?:0?[1-9]|1\d|2[0-8])(?P<sep4>/|-|\.)'
                          r'(?:(?:0?[1-9])|(?:1[0-2]))(?P=sep4)(?:(?:1[6-9]|[2-9]\d)?\d{2})$'
                },