为什么这个正则表达式在第一个捕获组重复出现之前不匹配所有内容?

Why does this regex not match everything till recurrence of first capture group?

我如何让它做到这一点?

现在它在换行符处停止(就像 "Chicago," 之后)。 或者,如果我使用 DOTALL,它只匹配 "Abbott A (1988)",然后匹配字符串的其余部分,直到最后。 我希望它在下一次出现 (([\w\s]+)(([1|2]\d{3}))) 时停止,即 ... "Albu OB and Flyverbom M (2016)"。等等等等。

欢迎指点。

pattern = r"(([\w\s]+)\(([1|2]\d{3})\))(.*)"

示例字符串

"Abbott A (1988) The System of Professions: An Essay on the Division of Expert Labor. Chicago,
IL: University of Chicago Press.
Albu OB and Flyverbom M (2016) Organizational transparency: conceptualizations, con-
ditions, and consequences. Business & Society. Epub ahead of print 13 July. DOI:
10.1177/0007650316659851.
Ananny M (2016) Toward an ethics of algorithms: convening, observation, probability, and timeli-
ness. Science, Technology & Human Values 41(1): 93–117. DOI: 10.1177/0162243915606523."

沙盒here

您可以使用

(?sm)^([^()\n\r]+)\(([12]\d{3})\)(.*?)(?=^[^()\n\r]+\([12]\d{3}\)|\Z)

regex demo

详情

  • (?sm) - re.DOTALLre.MULTILINE 启用
  • ^ - 行首
  • ([^()\n\r]+) - 第 1 组:除 ()、CR 和 LF
  • 之外的一个或多个字符
  • \( - 一个(
  • ([12]\d{3}) - 第 2 组:12 然后任意 3 个数字
  • \) - 一个 ) 字符
  • (.*?) - 第 3 组:任何 0+ 个字符,包括换行符,尽可能少,直到(但不包括匹配项)第一个...
  • (?=^[^()\r\n]+\([12]\d{3}\)|\Z) -(正向前瞻要求其模式紧邻当前位置的右侧):
    • ^[^()\r\n]+\([12]\d{3}\) - 与模式的开头相同但没有组
    • | - 或
    • \Z - 全文结束。