python - 在 python 中循环一个正则表达式替换一个字符串——缺少一些明显的东西

标签 python regex

我正在尝试从文档的引文中迭代地删除第 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/

相关文章:

python - 在 Pandas 数据框中按时间范围对行进行分组

python - networkx 计算数字分类需要 int?

regex - Perl 正则表达式捕获组和重新排列模式

javascript - 即使在 POST 调用中传递它之后,Django 也会给出 'CSRF token missing or incorrect.' 错误

python - Theano:使用 CSV 文件中的数据训练 theano 神经网络

c++ - 提取两个词之间的域

c++ - 解析 HTTP 摘要认证的正确正则表达式模式是什么?

c# - 在 C# 中使用正则表达式查找和替换字符串中的 *

python - 将 sprite 与 pyganim 一起使用时出现异常

c - 在 C 中使用正则表达式时,\d 不起作用,但 [0-9] 起作用