使用Regex查找具有重复{}的Groups()

时间:2012-02-01 20:13:11

标签: python regex

我正在尝试分析以下文本块来收集文化+亚文化(理想情况下分别在第1组和第2组):

  

众神之家。极乐世界,阿瓦隆,尘世天堂.--凯尔特人(普通):MacCulloch Celtic 14;爱尔兰人:同上。 37f。,114ff。,Cross;威尔士:同上。 193; Icel。:MacCulloch Eddic 312ff。;印度教:Penzer I 125 n。 1;犹太人:纽曼.--夏威夷:Beckwith神话67;所以。上午。印度(Apapocuv \ xe1-Guarani):M \ xe9traux 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'之前只获得'印度'而不是So.上午。印。

以下是我对整个系统的逻辑/要求的细分:

  1. 第一组'(\w+)\.?\:'适用于以下结尾的任何单词:(爱尔兰语,犹太语,夏威夷语,印度语)
  2. 第二组'(\w+\.?\s?){0,3}'专门用于“So. Am.Indian”这是我遇到麻烦的部分。我得到印度人,但不是。上午。印度人。我还需要获得诸如“So.Am.Indian,S.A。Indian,So。A. Indian,S。Am.Indian”等变体。
  3. 第三组'\((.*?)\)\'(连同第二部分)获得额外的子部落:非洲(方)
  4. 我希望将这些工作分成两组,但我稍后可以在代码中处理三个。如果有人有任何想法,我将非常感激。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

向组添加重复运算符(如{0,3})的问题是,每次匹配时,该组的反向引用都将被覆盖。如果要捕获整个重复匹配,则需要使用嵌套组:

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

这将生成一个额外的反向引用(在这种情况下为\2),您可以忽略它,但如果这让您感到困扰,许多正则表达式引擎对非引用组也有(?: )语法:

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