如何在regex或中选择正确的捕获组?

2024-05-12 14:25:57 发布

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

假设我得到了一张名单(第一名+最后一名)。我想匹配列表中由名+姓包围的所有中间名。现在,在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"\1", input_str)

然而,这只适用于列表中的第一个名字(约翰·史密斯)。我很快意识到这是因为如果它实际上与列表中的任何其他名称匹配,那么捕获组将有一个不同的索引,比如第二个名称的\2。有没有办法让捕获组在仍然使用regex或matcher的情况下获取相应的中间名


Tags: 字符串name名称middle列表namesjohnregex
1条回答
网友
1楼 · 发布于 2024-05-12 14:25:57

因为您使用的是OR,所以regex将匹配其中一个
第一部分,即第一组\1,将\2留空或
第二部分,即第二组\2,将\1留空。
因此,您可以在代码中使用这两个组进行替换,如下所示:

re.sub(regex_str, r"\1\2", input_str)

相关问题 更多 >