|
2 | 2 |
|
3 | 3 |
|
4 | 4 | def re_escape(fn):
|
5 |
| - def arg_escaped(this, *args): |
| 5 | + def arg_escaped(this, *args, **kwargs): |
6 | 6 | t = [isinstance(a, VerEx) and a.s or re.escape(str(a)) for a in args]
|
7 |
| - return fn(this, *t) |
| 7 | + return fn(this, *t, **kwargs) |
8 | 8 | return arg_escaped
|
9 | 9 |
|
| 10 | + |
| 11 | +def group(val, name=None): |
| 12 | + prefix = '?P<{0}>'.format(name) if name else '' |
| 13 | + return '(' + prefix + val + ')' |
| 14 | + |
10 | 15 |
|
11 | 16 | class VerEx(object):
|
12 | 17 | '''
|
@@ -50,49 +55,49 @@ def source(self):
|
50 | 55 |
|
51 | 56 | # ---------------------------------------------
|
52 | 57 |
|
53 |
| - def anything(self): |
54 |
| - return self.add('(.*)') |
| 58 | + def anything(self, name=None): |
| 59 | + return self.add(group('.*', name)) |
55 | 60 |
|
56 | 61 | @re_escape
|
57 | 62 | def anything_but(self, value):
|
58 |
| - return self.add('([^' + value + ']*)') |
| 63 | + return self.add(group('[^' + value + ']*')) |
59 | 64 |
|
60 | 65 | def end_of_line(self):
|
61 | 66 | return self.add('$')
|
62 | 67 |
|
63 | 68 | @re_escape
|
64 | 69 | def maybe(self, value):
|
65 |
| - return self.add("(" + value + ")?") |
| 70 | + return self.add(group(value) + "?") |
66 | 71 |
|
67 | 72 | def start_of_line(self):
|
68 | 73 | return self.add('^')
|
69 | 74 |
|
70 | 75 | @re_escape
|
71 |
| - def find(self, value): |
72 |
| - return self.add('(' + value + ')') |
| 76 | + def find(self, value, name=None): |
| 77 | + return self.add(group(value, name)) |
73 | 78 | then = find
|
74 | 79 |
|
75 | 80 | # special characters and groups
|
76 | 81 |
|
77 | 82 | @re_escape
|
78 | 83 | def any(self, value):
|
79 |
| - return self.add("([" + value + "])") |
| 84 | + return self.add(group("[" + value + "]")) |
80 | 85 | any_of = any
|
81 | 86 |
|
82 | 87 | def line_break(self):
|
83 |
| - return self.add(r"(\n|(\r\n))") |
| 88 | + return self.add(group(r"\n|(\r\n)")) |
84 | 89 | br = line_break
|
85 | 90 |
|
86 | 91 | @re_escape
|
87 | 92 | def range(self, *args):
|
88 | 93 | from_tos = [args[i:i+2] for i in range(0, len(args), 2)]
|
89 |
| - return self.add("([" + ''.join(['-'.join(i) for i in from_tos]) + "])") |
| 94 | + return self.add(group("[" + ''.join(['-'.join(i) for i in from_tos]) + "]")) |
90 | 95 |
|
91 | 96 | def tab(self):
|
92 | 97 | return self.add(r'\t')
|
93 | 98 |
|
94 |
| - def word(self): |
95 |
| - return self.add(r"(\w+)") |
| 99 | + def word(self, name=None): |
| 100 | + return self.add(group(r"\w+", name)) |
96 | 101 |
|
97 | 102 | def OR(self, value=None):
|
98 | 103 | ''' `or` is a python keyword so we use `OR` instead. '''
|
|
0 commit comments