我试图找到一个解决方案,按组中的出现次数拆分字符串。
字符串的格式如下:"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}
以指定出现次数,但似乎{}仅适用于字符,而不适用于单词。
您可以将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']
您可以将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']