使用Regex查找带有Repeat{}的组()

2024-05-19 01:15:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图分析以下文本块,以收集文化+次文化(最好分别在第1组和第2组中):

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.

到目前为止,我最好的尝试是使用以下Regex:

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

结果如下:

^{pr2}$

它的问题是,它只能在“Apapocuv\xe1 Guarani”之前得到“Indian”,而不是这样。是。印第安人。在

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

  1. 第一组'(\w+)\.?\:'表示以a结尾的任何单词:(爱尔兰语、犹太语、夏威夷语、印度教语)
  2. 第二组'(\w+\.?\s?){0,3}'专门用来得到“So”。是。“这是我遇到麻烦的部分。我有印度血统,但不是。是。印第安人。我还需要得到一些变体,比如“So”。是。印第安人,南美洲印第安人,所以。A、 印第安,南美洲。“印第安人”
  3. 第三组'\((.*?)\)\'(与第二部分一起)得到额外的子部落so:Africa(Fang)

我希望将这些工作分成两个组,但稍后我可以在代码中处理三个组。如果有人有什么想法,我会非常感激的。在


Tags: ofthe文本homeso文化indianafrica
2条回答

示例(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]);
}

输出

^{pr2}$

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

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

这将生成一个额外的反向引用(在本例中是\2),您可以忽略它,但是如果这让您感到困扰,许多regex引擎也为非引用组使用(?: )语法:

^{pr2}$

相关问题 更多 >

    热门问题