2012-02-01 37 views
0

我想(理想情況下分別在組1 & 2)分析文本,收集文化+亞文化的以下塊:使用正則表達式查找組()與重複{}

首頁衆神之中。極樂世界,阿瓦隆,人間天堂.--凱爾特人(普通):麥考洛克凱爾特人14;愛爾蘭:同上。 37f。,114ff。,Cross;威爾士語:同上。 193; Icel .: MacCulloch Eddic 312ff。印度教:Penzer I 125 n。 1;猶太人:紐曼人 - 夏威夷:貝克威斯神話67;所以。上午。印度語(Apapocuv \ xe1-Guarani):M \ xtra9 RMLP XXXIII 122;非洲(方):Trilles 130

我最好的嘗試到目前爲止使用以下正則表達式:

(\w+)\.?\:|(\w+\.?\s?){0,3}\((.*?)\)\: 

導致以下:

[(u'', u'Celtic ', u'general'), (u'Irish', u'', u''), (u'Welsh', u'', u''), (u'Icel', u'', u''), (u'Hindu', u'', u''), (u'Jewish', u'', u''), (u'Hawaii', u'', u''), (u'', u'Indian ', u'Apapocuv\xe1-Guarani'), (u'', u'Africa ', u'Fang')] 

它的問題是它在'Apapocuv \ xe1-Guarani'之前只獲得'印度'而不是如此。上午。印度人。

這裏是整個系統我的邏輯/需求的細分:

  1. 第一組'(\w+)\.?\:'是任何一個字的結尾:(愛爾蘭人,猶太人,夏威夷,印度)
  2. 二組'(\w+\.?\s?){0,3}'是專門獲得「所以我是印度人」這是我遇到麻煩的部分。我得到印度人,但不是那樣。上午。印度人。我還需要得到如下變體,例如「So.Am。Indian,SA Indian,So.A. Indian,S.Am.India」
  3. 第三組'\((.*?)\)\'(與第二部分一起)獲得額外的子部族所以:非洲(方)

我很想把這些工作分成兩組,但我可以在以後的代碼中處理三個。如果有人有任何想法,我會非常感激。

回答

0

實施例(JavaScript)的

var s = "Home of the gods. Elysium, Avalon, earthly paradise.--Celtic (general): MacCulloch Celtic 14; Irish: ibid. 37f., 114ff., Cross; Welsh: ibid. 193; Icel.: MacCulloch Eddic 312ff.; Hindu: Penzer I 125 n. 1.; Jewish: Neuman.--Hawaii: Beckwith Myth 67; So. Am. Indian (Apapocuv\xe1-Guarani): M\xe9traux RMLP XXXIII 122; Africa (Fang): Trilles 130." 
var rx = /(?:\-{2}|\;\s)((?:\w+\.\s)*\w+)(?:\s\(([^\)]+)\))?\:/g 

while(m = rx.exec(s)){ 
    console.log(m[1] + ', ' + m[2]); 
} 

輸出

Celtic, general 
Irish, undefined 
Welsh, undefined 
Hindu, undefined 
Jewish, undefined 
Hawaii, undefined 
So. Am. Indian, Apapocuvá-Guarani 
Africa, Fang 
+0

哇謝謝你!這工作得很好,簡化了我的兩個組,所以非常感謝。我唯一的問題是(也許我沒有詳細說明),它不允許捕捉「我是印度人」,而只是「印度人」。如果以前有三個縮寫詞,我需要能夠捕捉到,比如「So.Am。Indian,SA Indian,So.A. Indian,S.Am。Indian」如果你知道,請告訴我,謝謝再次。:) – theredknight 2012-02-01 22:44:46

+0

更新的例子。 – 2012-02-01 23:37:56

+0

太棒了!完美的作品!謝謝! – theredknight 2012-02-02 08:10:58

0

與添加的重複操作者像{0,3}到組的問題是,該組的向後引用將是每次匹配都會被覆蓋。如果你想捕捉整個重複比賽,你需要使用嵌套組:

(\w+).?\:|((\w+.?\s?){0,3})((.*?))\: 

,這將產生(在這種情況下\2)一個額外的回引,你可以簡單地忽略,但如果你煩惱,許多正則表達式引擎對非引用組也有一個(?:)語法:

(\w+).?\:|((?:\w+.?\s?){0,3})((.*?))\: 
+0

Hrrmm ...我嘗試了這兩個,他們沒有給我很好的結果。我正在使用python和re.findall,請告訴我你在用什麼?謝謝! – theredknight 2012-02-01 22:46:33