forked from sympy/sympy
-
Notifications
You must be signed in to change notification settings - Fork 1
/
conventions.py
58 lines (49 loc) · 1.74 KB
/
conventions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""
A few practical conventions common to all printers.
"""
import re
def split_super_sub(text):
"""Split a symbol name into a name, superscripts and subscripts
The first part of the symbol name is considered to be its actual
'name', followed by super- and subscripts. Each superscript is
preceded with a "^" character or by "__". Each subscript is preceded
by a "_" character. The three return values are the actual name, a
list with superscripts and a list with subscripts.
>>> from sympy.printing.conventions import split_super_sub
>>> split_super_sub('a_x^1')
('a', ['1'], ['x'])
>>> split_super_sub('var_sub1__sup_sub2')
('var', ['sup'], ['sub1', 'sub2'])
"""
pos = 0
name = None
supers = []
subs = []
while pos < len(text):
start = pos+1
if text[pos:pos+2] == "__":
start += 1
pos_hat = text.find("^", start)
if pos_hat < 0: pos_hat = len(text)
pos_usc = text.find("_", start)
if pos_usc < 0: pos_usc = len(text)
pos_next = min(pos_hat, pos_usc)
part = text[pos:pos_next]
pos = pos_next
if name is None:
name = part
elif part.startswith("^"):
supers.append(part[1:])
elif part.startswith("__"):
supers.append(part[2:])
elif part.startswith("_"):
subs.append(part[1:])
else:
raise RuntimeError("This should never happen.")
# make a little exception when a name ends with digits, i.e. treat them
# as a subscript too.
m = re.match('(^[a-zA-Z]+)([0-9]+)$', name)
if m is not None:
name, sub = m.groups()
subs.insert(0, sub)
return name, supers, subs