# -*- coding: utf-8 -*- import re from hashlib import md5 from uuid import uuid4 # Adapted from http://icodesnip.com/snippet/python/simple-universally-unique-id-uuid-or-guid def bnode_uuid(): yield uuid4() def is_ncname(value): """ BNode identifiers must be valid NCNames. From the `W3C RDF Syntax doc `_ "The value is a function of the value of the ``identifier`` accessor. The string value begins with "_:" and the entire value MUST match the `N-Triples nodeID `_ production". The nodeID production is specified to be a `name `_ name ::= [A-Za-z][A-Za-z0-9]* >>> assert is_ncname('') == False >>> assert is_ncname('999') == False >>> assert is_ncname('x') == True >>> assert is_ncname(u'x') == True >>> assert is_ncname(u'Michèle') == True However, vanilla uuid4s are not necessarily NCNames: >>> assert is_ncname('6fa459ea-ee8a-3ca4-894e-db77e160355e') == False So this has to be finessed with an appropriate prefix ... >>> assert is_ncname("urn:uuid:"+str(uuid4())) == True >>> from rdflib import BNode >>> assert is_ncname(BNode(_sn_gen=bnode_uuid, _prefix="urn:uuid:")) == True """ ncnameexp = re.compile("[A-Za-z][A-Za-z0-9]*") if ncnameexp.match(value): return True else: return False if __name__ == "__main__": import doctest doctest.testmod()