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



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

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

为了简单起见,让我们说names = [("John", "Smith"), ("Jane", "Doe")]。然后,我们会有regex_str = "bJohns+([A-Za-z]+)s+Smithb|bJanes+([A-Za-z]+)s+Doeb"

现在要遍历一个字符串并更改"的所有实例;第一中间最后一个";name简称为";中间的";对于所有";"倒数第一";在我的列表中的对(例如"John Jack Smith"应该用"Jack"代替(,我尝试

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

然而,这只适用于列表中的第一个名字(约翰·史密斯(。我很快意识到这是因为如果它真的与列表中的任何其他名称匹配,那么捕获组就会有一个不同的索引,比如第二个名称的2。有没有一种方法可以让捕获组在使用regex的OR匹配器的同时获取相应的中间名?

由于您使用的是OR,regex将匹配
第一个部分,因此匹配第一组1,使2为空,或者
第二个部分,从而匹配第二组2,使1为空
因此,您可以在代码上使用这两个组来进行如下替换:

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

最新更新