![](/img/trans.png)
[英]How to find all the exact matches in a given string using python Regex
[英]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
引擎是不是其中之一,但替代的發動機存在,所謂的regex
( pip 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.