我正在尝试从文档的引文中迭代地删除第 2、第 3...第 n 位作者,这些引文的形式是这样的(经过一些清理步骤后)
Straat, Ark, Sijtsma 2013, 75-99.
Nardulli, Peyton, Bajjalieh 2013, 139-192.
我的策略是,采用 AUTHOR1...AUTHORn-1 AUTHORn YEAR 形式的引用:
1) 匹配 AUTHORn-1 AUTHORn YEAR,
2)使用group replace,将匹配的子串替换为AUTHORn-1 YEAR,这样整体的引用就变成了AUTHOR1...AUTHORn-1 YEAR。
3) 然后循环再做一次,直到剩下的是 AUTHOR1 YEAR。我在这里进行了十次迭代,因为我知道没有超过十人的多作者引用。
我的代码如下:
def multiAuthor(citestring):
longcite = r'([\s(][A-Z1][A-Za-z1]*-?[A-Za-z1]*),[\s(][A-Z1][A-Za-z1]*-?[A-Za-z1]*[ ,]?( \(?\d\d\d\d[a-z]?[\s.,)])'
for x in range(0, 10):
newstring = re.sub(longcite, '\g<1>\g<2>', citestring)
return(newstring)
这是在由换行符分隔的脚注字符串上调用的,它在第一次迭代时起作用。对于我上面给出的两个示例匹配,它正确返回:
Straat, Ark 2013, 75-99.
Nardulli, Peyton 2013, 139-192.
但仅此而已。它没有成功地对第一个以外的任何循环进行替换,因此无法去除第二个作者。
我一直在使用 regex101 进行调试,但正式被难住了。表达式的第一次迭代:https://www.regex101.com/r/jM2fF4/3 --- 然后在运行替换后,第二个循环中的正则表达式也匹配,并且应该再次替换:https://regex101.com/r/fZ1pX7/4
所以我认为我的正则表达式是正确的。我只是错过了一些愚蠢而明显的东西吗? (我是 python 领域的新手,但我已经双重和三次检查了我的循环语法,我认为它是正确的。)
使用 python 3。
如果您想亲眼看看它的实际效果,我还在此处提供了一个最小的可运行示例(使用空格而不是换行符,但没有差异):https://github.com/paultopia/stray-cites/blob/master/minimal-test.py
救救我,StackObi Wan,你是我唯一的希望......?
编辑:我确实遗漏了一些明显的东西,请参阅下面我的 self 回答;留下这个,因为它可能是一个常见的 oopsie。
最佳答案
这是你想要的东西吗?
([^,]*).*?([0-9].*?)\.\s*
查看 regex101 上的 fork .
([^,]*)
匹配到,
(逗号).*?
忽略直到...([0-9].*?)\.最多匹配一个数字
.`(点)\s*
匹配在此之后的任何空格
然后,在替换中:
`\1 \2`
这是上面的第一个和第二个匹配项 - 分别是名称和页码/年份。
关于python - 在 python 中循环一个正则表达式替换一个字符串——缺少一些明显的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30687632/