python - 如何在 python 中找到所有可能的正则表达式匹配项?

标签 python regex parentheses

我正在尝试使用 python 及其正则表达式查找所有可能的词/标签对或其他嵌套组合。

sent = '(NP (NNP Hoi) (NN Hallo) (NN Hey) (NNP (NN Ciao) (NN Adios)))'

def checkBinary(sentence):
    n = re.findall("\([A-Za-z-0-9\s\)\(]*\)", sentence)
    print(n)

checkBinary(sent)

Output:
['(NP (NNP Hoi) (NN Hallo) (NN Hey) (NNP (NN Ciao) (NN Adios)))']

寻找:

['(NP (NNP Hoi) (NN Hallo) (NN Hey) (NNP (NN Ciao) (NN Adios)))', 
 '(NNP Hoi)', 
 '(NN Hallo)',
 '(NN Hey)', 
 '(NNP (NN Ciao) (NN Adios))',
 '(NN Ciao)',
 '(NN Adios)']

我认为正则表达式公式也可以找到嵌套的括号词/标签对,但它不会返回它们。我应该怎么做?

最佳答案

实际上不可能通过使用正则表达式来做到这一点,因为正则表达式表达了一种由常规语法定义的语言,可以通过非有限确定性自动机来解决,其中匹配由状态表示;然后要匹配嵌套括号,您需要能够匹配无限数量的括号,然后拥有一个具有无限数量状态的自动机。

为了能够解决这个问题,我们使用所谓的下推自动机,它用于定义上下文无关 语法。

Chomsky's hierarchy

因此,如果您的正则表达式与嵌套括号不匹配,那是因为它表达了以下自动机并且与您输入的任何内容都不匹配:

Regular expression visualization

Play with it

作为引用,请查看麻省理工学院关于该主题的类(class):

因此,有效解析字符串的方法之一是为嵌套括号构建语法(首先是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 (pip install regex) 可以进行递归匹配(这使得 re engine context free),cf this code snippet :

>>> 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)))']

关于python - 如何在 python 中找到所有可能的正则表达式匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23654329/

相关文章:

当其中一个线程出现未捕获的异常时,Python多线程程序不会退出

python - 让 Matplotlib 运行得更快

python - 清理 Pandas 中的数字列

java - 命题逻辑程序中括号的解析

PHP 和 NLP : Nested parenthesis (parser output) to array?

python - 我能以某种方式与子进程共享一个异步队列吗?

javascript - 给定页面标题列表,在 MediaWiki 页面中自动添加 wiki 链接

regex - 如何使用 R 解析 html 字符串?

Python:当字典键中有 ',' 时,为什么 re.sub 不将字典键替换为字典值

python - 通过匹配括号评估字符串