list_ports_windows: support devices with only VID. fixes #145

- PID field is now optional (regexp)
- if vid or pid is None, use a 0 for display
diff --git a/serial/tools/list_ports_common.py b/serial/tools/list_ports_common.py
index e5935c9..df12939 100644
--- a/serial/tools/list_ports_common.py
+++ b/serial/tools/list_ports_common.py
@@ -55,8 +55,8 @@
     def usb_info(self):
         """return a string with USB related information about device"""
         return 'USB VID:PID={:04X}:{:04X}{}{}'.format(
-            self.vid,
-            self.pid,
+            self.vid or 0,
+            self.pid or 0,
             ' SER={}'.format(self.serial_number) if self.serial_number is not None else '',
             ' LOCATION={}'.format(self.location) if self.location is not None else '')
 
diff --git a/serial/tools/list_ports_windows.py b/serial/tools/list_ports_windows.py
index 810417e..a070559 100644
--- a/serial/tools/list_ports_windows.py
+++ b/serial/tools/list_ports_windows.py
@@ -209,12 +209,13 @@
             # in case of USB, make a more readable string, similar to that form
             # that we also generate on other platforms
             if szHardwareID_str.startswith('USB'):
-                m = re.search(r'VID_([0-9a-f]{4})&PID_([0-9a-f]{4})(\\(\w+))?', szHardwareID_str, re.I)
+                m = re.search(r'VID_([0-9a-f]{4})(&PID_([0-9a-f]{4}))?(\\(\w+))?', szHardwareID_str, re.I)
                 if m:
                     info.vid = int(m.group(1), 16)
-                    info.pid = int(m.group(2), 16)
-                    if m.group(4):
-                        info.serial_number = m.group(4)
+                    if m.group(3):
+                        info.pid = int(m.group(3), 16)
+                    if m.group(5):
+                        info.serial_number = m.group(5)
                 # calculate a location string
                 loc_path_str = ctypes.create_unicode_buffer(250)
                 if SetupDiGetDeviceRegistryProperty(