簡體   English   中英

如何在python中找到所有可能的正則表達式匹配?

[英]How to find all possible regex matches in python?

我試圖找到所有可能的單詞/標簽對或其他嵌套組合與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)']

我認為正則表達式公式可以找到嵌套的括號詞/標簽對,但它不會返回它們。 我該怎么做?

實際上不可能通過使用正則表達式來實現這一點,因為正則表達式表達由常規語法定義的語言,可以通過非有限確定性自動機來解決,其中匹配由狀態表示; 然后,為了匹配嵌套的括號,你需要能夠匹配無數個括號,然后有一個自動機具有無限數量的狀態。

為了能夠應對這種情況,我們使用所謂的下推自動機,用於定義無上下文語法。

喬姆斯基的等級制度

因此,如果你的正則表達式與嵌套的括號不匹配,那是因為它表示以下自動機並且與輸入中的任何內容都不匹配:

正則表達式可視化

玩它

作為參考,請查看麻省理工學院關於該主題的課程:

因此,有效解析字符串的方法之一是為嵌套括號構建語法(首先是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引擎是不是其中之一,但替代的發動機存在,所謂的regexpip install regex ),可以做遞歸匹配(這使得免費重新引擎上下文),比照此代碼段

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

現代語言中使用的正則表達式不代表常規語言。 zmo說得對,語言Theroy中的常規語言由有限狀態自動機表示,但使用任何類型的回溯的正則表達式,如現代語言中使用的捕獲組,外觀等等,不能用語言中已知的FSA表示理論。 如何使用DFA甚至NFA表示類似(\\ w +)\\ 1的模式?

您正在尋找的正則表達式可能是這樣的(只匹配兩個級別):

(?=(\((?:[^\)\(]*\([^\)]*\)|[^\)\(])*?\)))

我在http://regexhero.net/tester/上測試了這個

匹配在捕獲的組中:

1:(NP(NNP Hoi)(NN Hallo)(NN嘿)(NNP(NN Ciao)(NN Adios))

1:(NNP Hoi)

1:(NN Hallo)

1:(NN嘿)

1:(NNP(NN Ciao)(NN Adios))

1:(NN Ciao)

1:(NN Adios)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM