实际上,不可能使用正则表达式来做到这一点,因为正则表达式表达了一种由 正则
语法定义的语言,该语言可以通过非限定性自动机来解决,其中匹配由状态表示;然后要匹配嵌套的括号,您需要能够匹配无限数量的括号,然后拥有一个具有无限数量状态的自动机。
为了解决这个问题,我们使用所谓的下推式自动机,用于定义 上下文无关 文法。
因此,如果您的正则表达式与嵌套括号不匹配,那是因为它表示以下自动机,并且与您输入的任何内容都不匹配:
玩吧
作为参考,请查看麻省理工学院有关该主题的课程:
- http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-045j-automata-computability-and-complexity-spring-2011/lecture-notes/MIT6_045JS11_lec04.pdf
- http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-005-elements-of-software-construction-fall-2011/lecture-notes/MIT6_005F11_lec05.pdf
- http://www.saylor.org/site/wp-content/uploads/2012/01/CS304-2.1-MIT.pdf
因此,有效解析字符串的方法之一是为嵌套括号建立语法(
pip install pyparsing第一个):
>>> import pyparsing>>> strings = pyparsing.Word(pyparsing.alphanums)>>> parens = pyparsing.nestedExpr( '(', ')', content=strings)>>> parens.parseString('(NP (NNP Hoi) (NN Hallo) (NN Hey) (NNP (NN Ciao) (NN Adios)))').asList()[['NP', ['NNP', 'Hoi'], ['NN', 'Hallo'], ['NN', 'Hey'], ['NNP', ['NN', 'Ciao'], ['NN', 'Adios']]]]注意:存在一些正则表达式引擎,它们确实使用下推实现嵌套的括号匹配。默认的python
re引擎不是其中之一,但是存在一个替代引擎,称为
regex(
pipinstallregex),它可以进行递归匹配(这使得re引擎上下文不受约束),请参见以下代码段:
>>> import regex>>> res = regex.search(r'(?<rec>((?:[^()]++|(?&rec))*))', '(NP (NNP Hoi) (NN Hallo) (NN Hey) (NNP (NN Ciao) (NN Adios)))')>>> res.captures('rec')['(NNP Hoi)', '(NN Hallo)', '(NN Hey)', '(NN Ciao)', '(NN Adios)', '(NNP (NN Ciao) (NN Adios))', '(NP (NNP Hoi) (NN Hallo) (NN Hey) (NNP (NN Ciao) (NN Adios)))']


