我有多个组,我想在第一个匹配时拆分字符串,所以代码如下所示:
regex_patterns = (
r"(?P<group1>345)",
r"(?P<group2>123)",
)
p = re.compile("|".join(regex_patterns))
p.split("012345", maxsplit=1)
这将输出["0", "123", None, "45"]
,因此它会为None
显示<group2>
。有没有办法只使这个输出["0", "123", "45"]
(即忽略不匹配的组),以及哪个组匹配?
答案 0 :(得分:1)
如果我理解正确,你想要所有的分裂没有None
,你想知道哪个分组发生了分裂。从那和你的措辞,我只是假设只有一个组可以匹配。
要获取群组名称,您必须执行另一场比赛,因为re.split
不会给您这样做。例如:
def custom_split(p, line):
splits = re.split(p, line)
match = re.search(p, line)
for group, found in match.groupdict().items():
if found is not None:
return group, [s for s in splits if s is not None]
return None, None
matched_group, splits = custom_split(p, "012345")
如果您不想匹配两次,则替代方法是仅执行re.search
,然后使用匹配位置(使用match.start()
和len(found)
)进行拆分自己。
答案 1 :(得分:1)
但是你的组合正则表达式包含多个命名的捕获组 因此,简化它并创建一个只有一个捕获组的组合正则表达式。
示例摘录
import re
regex_patterns = (
'345',
'123'
)
regex_combined_pattern = '('+ '|'.join(regex_patterns) +')'
print(regex_combined_pattern)
str = '012345603456'
result = re.split(regex_combined_pattern, str)
print(result)
<强>输出:强>
(345|123)
['0', '123', '4560', '345', '6']