diff --git a/ciprs/parsers.py b/ciprs/parsers.py
index 9f2bfec..c648277 100644
--- a/ciprs/parsers.py
+++ b/ciprs/parsers.py
@@ -113,6 +113,25 @@ class OffenseRecordRow(Parser):
         report["Offense Record"]["Records"].append(record)
 
 
+class OffenseRecordRowWithNumber(Parser):
+    """
+    Extract offense row like:
+        54  CHARGED  SPEEDING  INFRACTION  G.S. 20-141(B)
+    """
+
+    # pylint: disable=line-too-long
+    pattern = r"(?:\d*)?\s*(?P<action>\w+)\s+(?P<desc>[\w \-\(\)]+)[ ]{2,}(?P<severity>\w+)[ ]{2,}(?P<law>[\w. \-\(\)]+)"
+
+    def extract(self, matches, report):
+        record = {
+            "Action": matches["action"],
+            "Description": matches["desc"],
+            "Severity": matches["severity"],
+            "Law": matches["law"],
+        }
+        report["Offense Record"]["Records"].append(record)
+
+
 class OffenseDisposedDate(Parser):
 
     pattern = r".*Disposed on:\s*(?P<value>[\d/:]+)"
diff --git a/ciprs/reader.py b/ciprs/reader.py
index b084926..81f9faa 100644
--- a/ciprs/reader.py
+++ b/ciprs/reader.py
@@ -6,6 +6,7 @@ from ciprs.parsers import (
     CaseDetails,
     CaseStatus,
     OffenseRecordRow,
+    OffenseRecordRowWithNumber,
     OffenseDateTime,
     OffenseDisposedDate,
     CaseWasServedOnDate,
@@ -35,6 +36,7 @@ class PDFToTextReader:
             CaseDetails(self.report),
             CaseStatus(self.report),
             OffenseRecordRow(self.report),
+            OffenseRecordRowWithNumber(self.report),
             OffenseDateTime(self.report),
             OffenseDisposedDate(self.report),
             CaseWasServedOnDate(self.report),

diff --git a/tests/test_parsers.py b/tests/test_parsers.py
index ca14731..efa4bb8 100644
--- a/tests/test_parsers.py
+++ b/tests/test_parsers.py
@@ -39,6 +39,16 @@ def test_offense_record_charged():
     assert matches["code"] == "4450"
 
 
+def test_offense_record_charged_with_number():
+    string = "54  CHARGED       SPEEDING(80 mph in a 65 mph zone)    INFRACTION    G.S. 20-141(B)"  # noqa
+    matches = parsers.OffenseRecordRowWithNumber().match(string)
+    assert matches is not None, "Regex match failed"
+    assert matches["action"] == "CHARGED"
+    assert matches["desc"] == "SPEEDING(80 mph in a 65 mph zone)"
+    assert matches["severity"] == "INFRACTION"
+    assert matches["law"] == "G.S. 20-141(B)"
+
+
 def test_offense_record_arrainged():
     string = "ARRAIGNED SPEEDING(80 mph in a 65 mph zone)        INFRACTION    G.S. 20-141(B)    4450"  # noqa
     matches = parsers.OffenseRecordRow().match(string)

Parsers do not catch numbered offense rows
The offense row parser is designed to capture data from offense rows that look like this:

ACTION DESCRIPTION SEVERITY LAW CODE

However, on some records they look like this:

\# ACTION DESCRIPTION SEVERITY LAW

With # being either a zero padded number or blank
tests/test_parsers.py::test_offense_record_charged_with_number
tests/test_parsers.py::test_case_details[expected0- tests/test_parsers.py::test_case_details[expected1- tests/test_parsers.py::test_case_status tests/test_parsers.py::test_offense_record_charged tests/test_parsers.py::test_offense_record_arrainged tests/test_parsers.py::test_offense_record_convicted tests/test_parsers.py::test_offense_date_time tests/test_parsers.py::test_defendent_name tests/test_parsers.py::test_defendent_name_no_middle tests/test_parsers.py::test_defendent_race tests/test_parsers.py::test_defendent_sex_male tests/test_parsers.py::test_defendent_sex_female tests/test_parsers.py::test_defendent_sex_bad tests/test_parsers.py::test_defendent_dob tests/test_parsers.py::test_offense_disposed_date[2000-01-01- tests/test_parsers.py::test_offense_disposed_date[2016-07-20- tests/test_parsers.py::test_case_was_served_on_date[2000-09-09- tests/test_parsers.py::test_case_was_served_on_date[2015-05-17-Case tests/test_parsers.py::test_known_offense_disposition_method tests/test_parsers.py::test_unknown_offense_disposition_method tests/test_parsers.py::test_court_type_other tests/test_parsers.py::test_court_type_cr tests/test_parsers.py::test_court_type_crs