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
59
60
| # Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved.
| # Licensed to PSF under a Contributor Agreement.
|
| """Safely evaluate Python string literals without using eval()."""
|
| import re
|
| simple_escapes = {"a": "\a",
| "b": "\b",
| "f": "\f",
| "n": "\n",
| "r": "\r",
| "t": "\t",
| "v": "\v",
| "'": "'",
| '"': '"',
| "\\": "\\"}
|
| def escape(m):
| all, tail = m.group(0, 1)
| assert all.startswith("\\")
| esc = simple_escapes.get(tail)
| if esc is not None:
| return esc
| if tail.startswith("x"):
| hexes = tail[1:]
| if len(hexes) < 2:
| raise ValueError("invalid hex string escape ('\\%s')" % tail)
| try:
| i = int(hexes, 16)
| except ValueError:
| raise ValueError("invalid hex string escape ('\\%s')" % tail)
| else:
| try:
| i = int(tail, 8)
| except ValueError:
| raise ValueError("invalid octal string escape ('\\%s')" % tail)
| return chr(i)
|
| def evalString(s):
| assert s.startswith("'") or s.startswith('"'), repr(s[:1])
| q = s[0]
| if s[:3] == q*3:
| q = q*3
| assert s.endswith(q), repr(s[-len(q):])
| assert len(s) >= 2*len(q)
| s = s[len(q):-len(q)]
| return re.sub(r"\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3})", escape, s)
|
| def test():
| for i in range(256):
| c = chr(i)
| s = repr(c)
| e = evalString(s)
| if e != c:
| print i, c, s, e
|
|
| if __name__ == "__main__":
| test()
|
|