diff --git a/pyap/source_US/data.py b/pyap/source_US/data.py index 3c378a6..39ee827 100644 --- a/pyap/source_US/data.py +++ b/pyap/source_US/data.py @@ -256,7 +256,7 @@ def states_abbrvs_regex() -> str: numbered_road_re = r"""[Ss][Tt][Aa][Tt][Ee]\ [Rr][Oo][Aa][Dd]\ \d{1,4}(?!\d)""" -numbered_route_re = r"""[Rr][Oo][Uu][Tt][Ee]\ \d{1,4}(?!\d)""" +numbered_route_re = r"""(?:[Uu][Ss]\ )?[Rr][Oo][Uu][Tt][Ee]\ \#?\d{1,4}(?!\d)""" numbered_alternate = ( r"""(?:[Aa][Ll][Tt]|[Aa][Ll][Tt][Ee][Rr][Nn][Aa][Tt][Ee])\ \d{1,4}(?!\d)""" @@ -268,41 +268,45 @@ def states_abbrvs_regex() -> str: states=states_abbrvs_regex() ) + # Used to handle edge cases where streets don't have a street type: # eg. `55 HIGHPOINT`, `600 HIGHWAY 32` -numbered_or_typeless_street_name = r""" - (?P - (?:{post_direction_re}{space_div})? - (?: - {single_street_name_regex} - | - [Aa][Tt]\ {interstate_street_type} - | - {highway_re} - | - {numbered_avenue_re} - | - {numbered_road_re} - | - {numbered_route_re} - | - {numbered_alternate} - | - {numbered_state_highway} +def numbered_or_typeless_street_name(idx: str) -> str: + return r""" + (?P + (?:{post_direction_re}{space_div})? + (?: + {single_street_name_regex} + | + [Aa][Tt]\ {interstate_street_type} + | + {highway_re} + | + {numbered_avenue_re} + | + {numbered_road_re} + | + {numbered_route_re} + | + {numbered_alternate} + | + {numbered_state_highway} + ) ) + """.format( + idx=idx, + post_direction_re=post_direction_re, + space_div=space_div, + single_street_name_regex=str_list_to_upper_lower_regex(single_street_name_list), + interstate_street_type=interstate_street_type, + highway_re=highway_re, + numbered_avenue_re=numbered_avenue_re, + numbered_road_re=numbered_road_re, + numbered_route_re=numbered_route_re, + numbered_alternate=numbered_alternate, + numbered_state_highway=numbered_state_highway, ) -""".format( - post_direction_re=post_direction_re, - space_div=space_div, - single_street_name_regex=str_list_to_upper_lower_regex(single_street_name_list), - interstate_street_type=interstate_street_type, - highway_re=highway_re, - numbered_avenue_re=numbered_avenue_re, - numbered_road_re=numbered_road_re, - numbered_route_re=numbered_route_re, - numbered_alternate=numbered_alternate, - numbered_state_highway=numbered_state_highway, -) + post_direction = r""" (?P @@ -1128,7 +1132,7 @@ def street_type_extended(idx: str) -> str: (?: {street_number}{space_div}? (?: - (?:{numbered_or_typeless_street_name}) + (?:{numbered_or_typeless_street_name_a}) | (?:{typed_street_name}(?![A-Za-z\d\.])) | @@ -1144,6 +1148,8 @@ def street_type_extended(idx: str) -> str: \d{{1,4}}{space_div}{post_direction_re}{space_div} \d{{1,4}}{space_div}{post_direction_re} ) + | + (?:{numbered_or_typeless_street_name_b}) ) (?P (?:{part_div}{floor})? @@ -1161,7 +1167,8 @@ def street_type_extended(idx: str) -> str: part_div=part_div, street_number=street_number, typed_street_name=typed_street_name, - numbered_or_typeless_street_name=numbered_or_typeless_street_name, + numbered_or_typeless_street_name_a=numbered_or_typeless_street_name("a"), + numbered_or_typeless_street_name_b=numbered_or_typeless_street_name("b"), street_type=street_type_extended("c"), post_direction=post_direction, post_direction_re=post_direction_re, diff --git a/tests/test_parser_us.py b/tests/test_parser_us.py index 8b51c98..0f920b5 100644 --- a/tests/test_parser_us.py +++ b/tests/test_parser_us.py @@ -183,7 +183,9 @@ def test_street_name(input, expected): ) def test_numbered_or_typeless_street_name(input, expected): """tests positive string match for a street name""" - execute_matching_test(input, expected, data_us.numbered_or_typeless_street_name) + execute_matching_test( + input, expected, data_us.numbered_or_typeless_street_name("a") + ) @pytest.mark.parametrize( @@ -525,6 +527,7 @@ def test_po_box_positive(input, expected): ("6123 SHEFFIELD HOUSE", True), ("99 Valley Greens Dr\nSouth Tower", True), ("612 NC 54 Apt B77", True), + ("US ROUTE #25", True), # negative assertions ("6 95 34 75 COMPANY PHONE IS", False), (", 666 Hell ST PMB 29700", False), @@ -665,6 +668,7 @@ def test_full_street_positive(input, expected): ("1234 LONG LANE\nB2 \nUPPER DARBY PA 19082", True), ("567-55 Arlington Terrace Fl1 \nJamaica, NY 11435", True), ("612 NC 54 Apt B77 \nCarrboro, NC 27510-6105", True), + ("US ROUTE #25\nMEGAVILLE NJ 08876", True), # negative assertions ("123 Nw Awesome Drive\n12345", False), ("ONE HEALING CENTER LLC, 16444", False),