Index: abp/filters/parser.py
===================================================================
--- a/abp/filters/parser.py
+++ b/abp/filters/parser.py
@@ -137,18 +137,17 @@
 Comment = _line_type('Comment', 'text', '! {.text}')
 Metadata = _line_type('Metadata', 'key value', '! {0.key}: {0.value}')
 Filter = _line_type('Filter', 'text selector action options', '{.text}')
 Include = _line_type('Include', 'target', '%include {0.target}%')
 
 
 METADATA_REGEXP = re.compile(r'\s*!\s*(.*?)\s*:\s*(.*)')
 INCLUDE_REGEXP = re.compile(r'%include\s+(.+)%')
-HEADER_REGEXP = re.compile(r'\[(?:(Adblock(?:\s*Plus\s*[\d\.]+?)?)|.*)\]',
-                           flags=re.I)
+HEADER_REGEXP = re.compile(r'\[(Adblock(?:\s*Plus\s*[\d\.]+?)?)\]', flags=re.I)
 HIDING_FILTER_REGEXP = re.compile(r'^([^/*|@"!]*?)#([@?])?#(.+)$')
 FILTER_OPTIONS_REGEXP = re.compile(
     r'\$(~?[\w-]+(?:=[^,]+)?(?:,~?[\w-]+(?:=[^,]+)?)*)$'
 )
 
 
 def _parse_instruction(text):
     match = INCLUDE_REGEXP.match(text)
@@ -289,20 +288,17 @@
     stripped = line.strip()
 
     if stripped == '':
         return EmptyLine()
 
     if position == 'start':
         match = HEADER_REGEXP.search(line)
         if match:
-            version = match.group(1)
-            if not version:
-                raise ParseError('Malformed header', line)
-            return Header(version)
+            return Header(match.group(1))
 
     if stripped.startswith('!'):
         match = METADATA_REGEXP.match(line)
         if match:
             key, value = match.groups()
             if position != 'body' or key.lower() == 'checksum':
                 return Metadata(key, value)
         return Comment(stripped[1:].lstrip())
Index: tests/test_parser.py
===================================================================
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -159,23 +159,21 @@
 
 
 def test_parse_start():
     # Header-line lines are headers.
     assert parse_line('[Adblock Plus 1.1]', 'start').type == 'header'
     # Even if they have extra characters around.
     assert parse_line('foo[Adblock Plus 1.1] bar', 'start').type == 'header'
 
-    with pytest.raises(ParseError):
-        # But the inside of the header needs to be right.
-        parse_line('[Adblock Minus 1.1]', 'start').type
-
-    with pytest.raises(ParseError):
-        # Really right!
-        parse_line('[Adblock 1.1]', 'start')
+    # But the inside of the header needs to be right.
+    assert parse_line('[Adblock Minus 1.1]', 'start').type == 'filter'
+    # Really right!
+    assert parse_line('[Adblock 1.1]', 'start').type == 'filter'
+    # Otherwise it's just considered a filter.
 
     # Metadata-like lines are metadata.
     assert parse_line('! Foo: bar', 'metadata').type == 'metadata'
 
 
 def test_parse_metadata():
     # Header-like lines are just filters.
     assert parse_line('[Adblock 1.1]', 'metadata').type == 'filter'
