假设我得到了一张名单(第一名+最后一名)。我想匹配列表中由名+姓包围的所有中间名。现在,在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的情况下获取相应的中间名
因为您使用的是
OR
,所以regex将匹配其中一个第一部分,即第一组
\1
,将\2
留空或第二部分,即第二组
\2
,将\1
留空。因此,您可以在代码中使用这两个组进行替换,如下所示:
相关问题 更多 >
编程相关推荐