This commit is contained in:
Ingy döt Net 2013-04-10 21:29:02 -07:00
parent 764da6cbbb
commit db842d013d
19005 changed files with 197040 additions and 7 deletions

View file

@ -0,0 +1,15 @@
>>> import re
>>> def ms2(txt="a!===b=!=c", sep=["==", "!=", "="]):
if not txt or not sep:
return []
ans = m = []
for m in re.finditer('(.*?)(?:' + '|'.join('('+re.escape(s)+')' for s in sep) + ')', txt):
ans += [m.group(1), (m.lastindex-2, m.start(m.lastindex))]
if m and txt[m.end(m.lastindex):]:
ans += [txt[m.end(m.lastindex):]]
return ans
>>> ms2()
['a', (1, 1), '', (0, 3), 'b', (2, 6), '', (1, 7), 'c']
>>> ms2(txt="a!===b=!=c", sep=["=", "!=", "=="])
['a', (1, 1), '', (0, 3), '', (0, 4), 'b', (0, 6), '', (1, 7), 'c']

View file

@ -0,0 +1,24 @@
>>> def ms(txt="a!===b=!=c", sep=["==", "!=", "="]):
if not txt or not sep:
return []
size = [len(s) for s in sep]
ans, pos0 = [], 0
def getfinds():
return [(-txt.find(s, pos0), -sepnum, size[sepnum])
for sepnum, s in enumerate(sep)
if s in txt[pos0:]]
finds = getfinds()
while finds:
pos, snum, sz = max(finds)
pos, snum = -pos, -snum
ans += [ txt[pos0:pos], [snum, pos] ]
pos0 = pos+sz
finds = getfinds()
if txt[pos0:]: ans += [ txt[pos0:] ]
return ans
>>> ms()
['a', [1, 1], '', [0, 3], 'b', [2, 6], '', [1, 7], 'c']
>>> ms(txt="a!===b=!=c", sep=["=", "!=", "=="])
['a', [1, 1], '', [0, 3], '', [0, 4], 'b', [0, 6], '', [1, 7], 'c']

View file

@ -0,0 +1,67 @@
def min_pos(List):
return List.index(min(List))
def find_all(S, Sub, Start = 0, End = -1, IsOverlapped = 0):
Res = []
if End == -1:
End = len(S)
if IsOverlapped:
DeltaPos = 1
else:
DeltaPos = len(Sub)
Pos = Start
while True:
Pos = S.find(Sub, Pos, End)
if Pos == -1:
break
Res.append(Pos)
Pos += DeltaPos
return Res
def multisplit(S, SepList):
SepPosListList = []
SLen = len(S)
SepNumList = []
ListCount = 0
for i, Sep in enumerate(SepList):
SepPosList = find_all(S, Sep, 0, SLen, IsOverlapped = 1)
if SepPosList != []:
SepNumList.append(i)
SepPosListList.append(SepPosList)
ListCount += 1
if ListCount == 0:
return [S]
MinPosList = []
for i in range(ListCount):
MinPosList.append(SepPosListList[i][0])
SepEnd = 0
MinPosPos = min_pos(MinPosList)
Res = []
while True:
Res.append( S[SepEnd : MinPosList[MinPosPos]] )
Res.append([SepNumList[MinPosPos], MinPosList[MinPosPos]])
SepEnd = MinPosList[MinPosPos] + len(SepList[SepNumList[MinPosPos]])
while True:
MinPosPos = min_pos(MinPosList)
if MinPosList[MinPosPos] < SepEnd:
del SepPosListList[MinPosPos][0]
if len(SepPosListList[MinPosPos]) == 0:
del SepPosListList[MinPosPos]
del MinPosList[MinPosPos]
del SepNumList[MinPosPos]
ListCount -= 1
if ListCount == 0:
break
else:
MinPosList[MinPosPos] = SepPosListList[MinPosPos][0]
else:
break
if ListCount == 0:
break
Res.append(S[SepEnd:])
return Res
S = "a!===b=!=c"
multisplit(S, ["==", "!=", "="]) # output: ['a', [1, 1], '', [0, 3], 'b', [2, 6], '', [1, 7], 'c']
multisplit(S, ["=", "!=", "=="]) # output: ['a', [1, 1], '', [0, 3], '', [0, 4], 'b', [0, 6], '', [1, 7], 'c']