diff --git a/src/sgfParser/propValues.py b/src/sgfParser/propValues.py
--- a/src/sgfParser/propValues.py
+++ b/src/sgfParser/propValues.py
@@ -3,6 +3,12 @@ import re
 from . import ParserError, skipWhitespace
 
 
+class Regexp:
+	number=re.compile(r"(\+|-|)\d+")
+	real=re.compile(r"(\+|-|)\d+(\.\d+)?")
+	point=re.compile(r"[a-zA-Z]{2}|")
+
+
 class Composed:
 	def __init__(self,a=None,b=None):
 		self.a=a
@@ -89,34 +95,31 @@ def compose(vTypeA,vTypeB):
 
 
 def number(s,start):
-	r=re.compile(r"(\+|-|)\d+")
-	m=r.match(s,start)
-	if m is None: raise ParserError("expected a number matching '(\+|-|)\d+'",s,start)
+	m=Regexp.number.match(s,start)
+	if m is None: raise ParserError("expected a number matching '{0}'".format(Regexp.number.pattern),s,start)
 	res=int(m.group(0))
 	return (m.end(),res)
 
 
 def real(s,start):
-	r=re.compile(r"(\+|-|)\d+(\.\d+)?")
-	m=r.match(s,start)
-	if m is None: raise ParserError("expected a real number matching '(\+|-|)\d+(\.\d+)?'",s,start)
+	m=Regexp.real.match(s,start)
+	if m is None: raise ParserError("expected a real number matching '{0}'".format(Regexp.real.pattern),s,start)
 	res=float(m.group(0))
 	return (m.end(),res)
 
 
 def double(s,start):
-	r=re.compile(r"1|2")
-	m=r.match(s,start)
-	if m is None: raise ParserError("expected a double value, either '1' or '2'",s,start)
-	res=int(m.group(0))
-	return (m.end(),res)
+	c=s[start]
+	if c not in ("1", "2"):
+		raise ParserError("expected a double value, either '1' or '2'",s,start)
+	return (start+1,c)
 
 
 def color(s,start):
-	r=re.compile(r"B|W")
-	m=r.match(s,start)
-	if m is None: raise ParserError("expected a color value, either 'B' or 'W'",s,start)
-	return (m.end(),m.group(0))
+	c=s[start]
+	if c not in ("B", "W"):
+		raise ParserError("expected a color value, either 'B' or 'W'",s,start)
+	return (start+1,c)
 
 
 def text(simple=True,composed=False):
@@ -159,9 +162,8 @@ def anything(s,start):
 
 # go specific
 def point(s,start):
-	r=re.compile(r"[a-zA-Z]{2}|") # !! limit to board size
-	m=r.match(s,start)
-	if m is None: raise ParserError("expected a point value matching '[a-zA-Z]{2}|'",s,start)
+	m=Regexp.point.match(s,start) # !! limit to board size
+	if m is None: raise ParserError("expected a point value matching '{0}'".format(Regexp.point.pattern),s,start)
 	if m.group(0)=="": # pass, !! tt
 		return (m.end(),tuple())
 	col=m.group(0)[0]