2017-08-08 58 views
-1
<name>name for the group</name><description>server-description</description><resource>10.1.1.1:*</resource><resource>10.1.1.2:*</resource><resource>10.1.1.3:*</resource><apply>selected</apply><network-connect-acl><<name>name2</name><description>description2/description><resource>10.2.2.0/26:*</resource><apply>selected</apply> 

我已經轉換XML文件字符串輸入的值,並試圖搭上<resource>ABC</resource>多次出現,我有以下的正則表達式 在python3定義正則表達式不捕獲所有組

regex = re.compile(r'(<name>.*?</name>)(.*?)(<resource>.*?</resource>)+') 
print(regex.findall(string)) 

而是捕捉所有三個出現的,它只能轉換第一個:

('<name>name for the group</name>', '<description>server- 
description</description>', '<resource>10.1.1.1:*</resource>') 

我想正則表達式搭上弦之間和標籤。如果我們將上面的字符串作爲示例,我希望能夠看到這樣的內容;

<name>name for the group</name><resource>10.1.1.1:*</resource><resource>10.1.1.2:*</resource><resource>10.1.1.3:*</resource><name>name2</name><description>description2/description><resource>10.2.2.0/26:*</resource> 

在這樣做時,我將與其相關聯的資源元素組「name」元素,使得通過此正則表達式匹配的第一個元組將包含這樣的:

('<name>nameforthegroup</name>','<resource>10.1.1.1:*</resource> 
<resource>10.1.1.2:*</resource><resource>10.1.1.3:*</resource>') 

和第二元組等堡將像這樣

('<name>name2</name>','<resource>10.2.2.0/26:*</resource>) 

該文件包含了數百個這樣的記錄,但是當我運行代碼,我得到這樣的:

[('<name>nameforthegroup</name>', '<description>server-description</description>', '<resource>10.1.1.1:*</resource>'), ('<name>name2</name>', '<description>description2/description>', '<resource>10.2.2.0/26:*</resource>')] 
+1

歡迎SO。使用代碼片段是很好的,但首先你應該明確地顯示不僅正則表達式和希望的結果(你也不是很好),而是要匹配的文本。 – Gangnus

+0

謝謝你,對不起的入口感到抱歉。我已更新它以提供更多解釋。 – tirexxerit

回答

1

(<name>.*?</name>)後面添加一個問號(?),以確保它可以出現0或1次或一次以上(取決於輸入)星號(*)。

re.compile(r'(<name>.*?</name>)(.*?)(<resource>.*?</resource>)<apply>') 

這將讓正則表達式捕獲額外的資源。

Online Demo

如果你不需要的描述,你可以只是從來沒有捕捉到它:

re.compile('(<name>.*?</name>).*?(<resource>.*?</resource>)<apply>') 
+0

但這也顯示例如「選擇」,這是我不想要的。如果我將資源正則表達式更改爲「(。+?)」,那麼這次我只獲取一個資源,而不是所有的資源。 – tirexxerit

+0

@tirexxerit,不,它從不捕獲'選擇'。 – droravr

+0

@tirexxerit,哦,你更新了輸入,我沒有注意到。編輯正則表達式,現在應該沒問題。 – droravr