正则表达式:按事件组划分

时间:2019-03-28 19:46:55

标签: regex python-3.x split find-occurrences

我正试图找到一种解决方案,以按组出现的方式拆分字符串。

字符串的格式如下:"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}来指定出现的次数,但是看来{}仅适用于字符,不适用于单词。

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以将re.split与交替模式一起使用,其中交替模式包括由正后向和超前模式包围的斜杠,以确保斜杠前的字符比斜杠后的字符晚于序列:< / p>

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']