#!/usr/bin/env python """ntriplesg.py - N-Triples grammar terms for Pyrple.""" # Condition: this module may only import from stdlib import re uri = r'<[^>]*>' uriview = r'<[^:]+:[^>]+>' bnode = r'_:[A-Za-z][A-Za-z0-9]*' var = r'\?[A-Za-z][A-Za-z0-9]*' lang = r'"(?:[^"\\]*(?:\\.[^"\\]*)*)"(?:@(?:[a-z0-9]+(?:-[a-z0-9]+)?))?' lit = r'(?:' + lang + r'(?:\^\^(?:' + uri + ')))|' + '(?:' + lang + ')' spec = ((uriview, bnode), (uriview,), (lit, uriview, bnode)) loose = ((lit, uri, bnode, var), (uri, bnode, var), (lit, uri, bnode, var)) default = loose triple = r'^[ \t]*(%s)[ \t]+(%s)[ \t]+(%s)[ \t]*\.[ \t]*$' def makeSchema(s): return tuple(['%s' % '|'.join(['(?:%s)' % p for p in term]) for term in s]) r_triple = re.compile(triple % makeSchema(default)) r_comment = re.compile(r'^[ \t]*#') r_literal = re.compile(lit.replace('?:', '')) # N-Triples testing def isNTriples(s): s = s.replace('\r\n', '\n') s = s.replace('\r', '\n') for line in s.split('\n'): if not (r_triple.match(line) or r_comment.match(line) or (not line.strip(' \t'))): return False return True # N-Triples string quoting # Cf. http://www.w3.org/TR/rdf-testcases/#ntrip_strings r_disq = re.compile(ur'(? 0x10FFFF: raise "IllegalCharacterError", "Found: %s" % U s = str(s).decode('unicode-escape') return unicode(s) if __name__=="__main__": print __doc__