diff --git a/path.py b/path.py
index <HASH>..<HASH> 100644
--- a/path.py
+++ b/path.py
@@ -1487,16 +1487,19 @@ def _permission_mask(mode):
 
     >>> _permission_mask('u=x')(0o666) == 0o166
     True
+
+    >>> _permission_mask('g=')(0o157) == 0o107
+    True
     """
     # parse the symbolic mode
-    parsed = re.match('(?P<who>[ugoa]+)(?P<op>[-+=])(?P<what>[rwx]+)$', mode)
+    parsed = re.match('(?P<who>[ugoa]+)(?P<op>[-+=])(?P<what>[rwx]*)$', mode)
     if not parsed:
         raise ValueError("Unrecognized symbolic mode", mode)
 
     # generate a mask representing the specified permission
     spec_map = dict(r=4, w=2, x=1)
     specs = (spec_map[perm] for perm in parsed.group('what'))
-    spec = functools.reduce(operator.or_, specs)
+    spec = functools.reduce(operator.or_, specs, 0)
 
     # now apply spec to each subject in who
     shift_map = dict(u=6, g=3, o=0)
Allow empty subject, which is now meaningful for the '=' operator