正则表达式:按出现组拆分

问题描述 投票:0回答:2

我试图找到一个解决方案,按组中的出现次数拆分字符串。

字符串的格式如下:"AAA/BBB/CCC/DDD/BBB/CCC/DDD/BBB/DDD"

我希望字符串像这样拆分:

1)AAA/BBB/CCC/DDD

2)BBB/CCC/DDD

3)BBB/DDD

'/'始终是分隔符,单词总是AAA,BBB,CCC和DDD。

我用{x}尝试了正则表达式(AAA|BBB|CCC|DDD){x}以指定出现次数,但似乎{}仅适用于字符,而不适用于单词。

regex python-3.x split find-occurrences
2个回答
1
投票

您可以将re.findall与以下正前瞻模式一起使用,以确保只有在序列中允许的字符后面包含斜杠,并使用?作为转发器以使每个单词的匹配可选(但是贪婪):

import re
s = 'AAA/BBB/CCC/DDD/BBB/CCC/DDD/BBB/DDD'
re.findall('(?=[ABCD])(?:AAA(?:/(?=[BCD]))?)?(?:BBB(?:/(?=[CD]))?)?(?:CCC(?:/(?=D))?)?(?:DDD)?', s)

返回:

['AAA/BBB/CCC/DDD', 'BBB/CCC/DDD', 'BBB/DDD']

1
投票

您可以将re.split与包含斜线的交替模式一起使用,该斜线由正向后观和前瞻模式围绕,以确保斜杠前面的字符在序列中比后面的字符更符合后者:

import re
s = 'AAA/BBB/CCC/DDD/BBB/CCC/DDD/BBB/DDD'
re.split('(?:(?<=[BCD])/(?=A)|(?<=[CD])/(?=B)|(?<=D)/(?=C))', s)

返回:

['AAA/BBB/CCC/DDD', 'BBB/CCC/DDD', 'BBB/DDD']
© www.soinside.com 2019 - 2024. All rights reserved.