-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpatternreplacer.py
64 lines (49 loc) · 1.84 KB
/
patternreplacer.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
59
60
61
62
63
import re
class PatternReplacer:
def __init__(self, samplepattern, delimiters):
self.spans = []
self.delims = []
regex_inner = '|'.join([re.escape(d) for d in delimiters])
self.regex = re.compile('((%s)+)' % regex_inner)
for m in self.regex.finditer(samplepattern):
self.delims.append(m.groups()[0])
self.spans.append(m.span())
if len(self.spans) == 0:
self.begins_with_delimiter = False
self.ends_with_delimiter = False
return
self.begins_with_delimiter = False
if self.spans[0][0] == 0:
self.begins_with_delimiter = True
self.ends_with_delimiter = False
if self.spans[-1][-1] == len(samplepattern):
self.ends_with_delimiter = True
def get_n_delimiters(self):
return len(self.delims)
def verify(self, pattern):
delims = []
spans = []
for m in self.regex.finditer(pattern):
delims.append(m.groups()[0])
spans.append(m.span())
if delims != self.delims:
return False
if spans[0][0] == 0 and not self.begins_with_delimiter:
return False
if spans[-1][-1] == len(pattern) and not self.ends_with_delimiter:
return False
return True
def get_n_tokens(self):
return len(self.delims) + 1 - int(self.begins_with_delimiter) - int(self.ends_with_delimiter)
def replace(self, tokens):
assert len(tokens) == self.get_n_tokens(), self.get_n_tokens()
# copy
delims = [d for d in self.delims]
delims.append('')
out = ''
if self.begins_with_delimiter:
out += delims[0]
for i, t in enumerate(tokens, start=int(self.begins_with_delimiter)):
out += t
out += delims[i]
return out