#!/usr/bin/python """""" import re class Article: def __init__(self, s): s, self.r = str(s), str(s) if s[0] == '"': self.v, self.t = s[1:], 'Literal' elif s[0] == '?': self.v, self.t = s[1:], 'Univar' elif s[0] == '_': self.v, self.t = s[2:], 'Exivar' elif s[0] == '<': self.v, self.t = s[1:-1], 'URI' else: self.v, self.t, self.r = s, 'URI', '<%s>' % s def __repr__(self): return self.r def set(self, s): self.__init__(s) def parse(s, t=[]): if len(s) == 0: raise 'Document has no content' rc, a = re.compile(r'(\#[^\n]*)'), r'(<.*?>|_:\S+|\?\S+|"(?:\\"|[^"])*")[ \t]' rw, rt, y = re.compile(r'[ \t]+'), r'[ \t]*%s%s%s*.[ \t]*' % (a, a, a), t[:] for line in s.replace('\r\n', '\n').replace('\r', '\n').split('\n'): if re.compile(rt).match(line): x = re.compile(rt).findall(line)[0] y.append([Article(x[0]), Article(x[1]), Article(x[2])]) elif rc.match(line) or rw.match(line) or (len(line) == 0): continue else: raise 'Line is invalid', line return y def query(q, triples, r=[]): result = r[:] for t in triples: if (((q[0].t == 'Univar') or (t[0].r == q[0].r)) and ((q[1].t == 'Univar') or (t[1].r == q[1].r)) and ((q[2].t == 'Univar') or (t[2].r == q[2].r))): result.append(t) return result if __name__=="__main__": print __doc__