如何 select 更正正则表达式 OR 中的捕获组?

How to select correct capture group within regex OR?

假设我得到了一个名字列表(名字+姓氏)。我想匹配列表中所有被名字+姓氏包围的中间名。现在,在 Python 中,我的正则表达式模式字符串是:

regex_str = "|".join([r"\b%s\s+([A-Za-z]+)\s+%s\b" % (first_name, last_name) for (first_name, last_name) in names])

为简单起见,我们假设 names = [("John", "Smith"), ("Jane", "Doe")]。然后,我们将有 regex_str = "\bJohn\s+([A-Za-z]+)\s+Smith\b|\bJane\s+([A-Za-z]+)\s+Doe\b"

现在遍历一个字符串并将“first middle last”名称的所有实例更改为我列表中所有“first last”对的简单“middle”(例如,“John Jack Smith”应替换为“Jack” "), 我尝试了

re.sub(regex_str, r"", input_str)

但这只适用于列表中的第一个名字 (John Smith)。我很快意识到这是因为如果它实际上与列表中的任何其他名称匹配,捕获组将具有不同的索引,例如第二个名称的 。有没有办法让捕获组在仍然使用正则表达式的 OR 匹配器的同时获取相应的中间名?

由于您使用的是 OR,正则表达式将匹配
第一部分,因此第一组 </code>,留下 <code> 空或
第二部分,因此是第二组 </code>,留下 <code> 空。
所以你可以在你的代码中使用这两个组来替换如下:

re.sub(regex_str, r"", input_str)