Here is the generic algorithm of determining of the series from sequence by some feature SeriesFeature
. Examples show usage of splitting series in camelCase strings (in the same case).
from abc import ABCMeta, abstractmethod
from itertools import groupby, imap
# a,b,c -> ((None, a), (a, b), (b, c)) (ie (prev, cur) pairs)
#preiter = lambda it: izip(chain([None], it), it)
class SeriesFeature(object):
__metaclass__ = ABCMeta
id = None # series id
i = 0 # element index
def __init__(self, serid):
self.i = -1
self.id = serid
@abstractmethod
def __series__(self, el, serid):
"""Check element `el` and return new/old series id. `serid`
is current series id`
"""
def __call__(self, el):
self.i += 1
self.id = self.__series__(el, self.id)
return self.id
class CapitalizedSeries(SeriesFeature):
def __init__(self):
super(CapitalizedSeries, self).__init__(0)
def __series__(self, el, serid):
if self.i == 0 and el.isupper():
return serid
elif el.islower():
return serid
else:
return (serid + 1)%2
CamelCaseSeries = CapitalizedSeries
def iseries(flt, it):
series = (el[1] for el in groupby(it, flt()))
if isinstance(it, str):
return imap(''.join, series)
else:
return series
def camelcaseto(s, func):
"""Transform each CamelCase-string part with `func(ser)`"""
return imap(func, iseries(CamelCaseSeries, s))
########################## test ##############################################
print list(iseries(CapitalizedSeries, 'AaaaBbbCcAaa'))
print list(iseries(CapitalizedSeries, 'abcDefGhi'))
print ' '.join(camelcaseto("noSuchUserError", str.lower)).capitalize()
Комментариев нет:
Отправить комментарий
Thanks for your posting!