I would like to split a string like this
JavaScript
x
2
1
str = "$$Node_Type<block=begin>Blabla$$Node_Type<block=end>"
2
to something like this:
JavaScript
1
2
1
tab = ["$$Node_Type<block=begin>", "Blabla", "$$Node_Type<block=end>"]
2
but I can also have this:
JavaScript
1
2
1
str = "$$Node_Type1<block=begin>Blabla1$$Node_Type2<block=begin>Blabla2$$Node_Type2<block=end>$$Node_Type1<block=end>"
2
to something like this:
JavaScript
1
2
1
tab = ["$$Node_Type1<block=begin>", "Blabla1", "$$Node_Type2<block=begin>", "Blabla2", "$$Node_Type2<block=end>", "$$Node_Type1<block=end>"]
2
The idea at the end is to print it like that
JavaScript
1
7
1
$$Node_Type1<block=begin>
2
Blabla1
3
$$Node_Type2<block=begin>
4
Blabla2
5
$$Node_Type2<block=end>
6
$$Node_Type1<block=end>
7
Does someone has an idea ? Thx
Advertisement
Answer
You can take advantage of the fact that re.split
retains the “splitter” in the results if it’s a capturing group, and then:
JavaScript
1
13
13
1
import re
2
3
example = "Hello$$Node_Type1<block=begin>Blabla1$$Node_Type2<block=begin>Blabla2$$Node_Type2<block=end>$$Node_Type1<block=end>"
4
5
level = 0
6
for bit in re.split(r'($$[^>]+>)', example):
7
if bit.startswith('$$') and bit.endswith('block=end>'):
8
level -= 1
9
if bit:
10
print(' ' * level + bit)
11
if bit.startswith('$$') and bit.endswith('block=begin>'):
12
level += 1
13
This prints out
JavaScript
1
8
1
Hello
2
$$Node_Type1<block=begin>
3
Blabla1
4
$$Node_Type2<block=begin>
5
Blabla2
6
$$Node_Type2<block=end>
7
$$Node_Type1<block=end>
8