如何 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)
假设我得到了一个名字列表(名字+姓氏)。我想匹配列表中所有被名字+姓氏包围的中间名。现在,在 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)