我有一份地址列表,目前非常不干净。他们采用以下格式:
955 - 959 Fake Street
95-99 Fake Street
4-9 M4 Ln
95 - 99 Fake Street
99 Fake Street
我想要做的是拆分街道名称和街道号码。我需要一个适用于
的正则表达式955 - 959
95-99
4-9
95 - 99
99
我目前有这个:
^[0-9][0-9]\s*+(\s*-\s*[0-9][0-9]+)
适用于两位数地址,但不适用于三位或一位数地址。
由于
答案 0 :(得分:4)
我不确定你在这里尝试做什么\s*+
但你基本上得到了最后一部分[0-9][0-9]+
的答案,最后会找到2位以上的数字。
也许试试这个(它更简洁)。这会搜索1+位而不是2 +
\d+(\s*-\s*\d+)?
答案 1 :(得分:2)
您可以将大括号{2,3}用于2-3个数字 - 但*+
也不是正确的。
/^(([0-9]{1,3}\s-\s)?[0-9]{1,3})\s/
我嵌套了大括号,所以你只想要正则表达式的第一个结果。
它像这样分手了
([0-9]{1,3}\s-\s)?
首先,是否有一个带有空格 - 空格的1-3位数字 - 可选
然后..它以1-3位数字结尾,后跟空格。
答案 2 :(得分:2)
对于您的示例,您可以执行以下操作:
/^(\d+[-\s\d]*)\s/gm
说明:
/^(\d+[-\s\d]*)\s/gm
^ start of line
^ at least 1 digit and as many digits as possible
^ any character of the set -, space, digit
^ zero or more
^ trailing space
^ multiline for the ^ start of line assertion
答案 3 :(得分:0)
另一种方式可能是
In [83]: s = '955 - 959 Fake Street'
In [84]: s1 = '95-99 Fake Street'
In [85]: s2 = '95 - 99 Fake Street'
In [86]: s3 = '99 Fake Street'
In [87]: d = re.search(r'^[0-9]+[ ]*(-[ ]*[0-9]+){0,1}', s3)
In [88]: d.group()
Out[88]: '99 '
In [89]: d = re.search(r'^[0-9]+[ ]*(-[ ]*[0-9]+){0,1}', s2)
In [90]: d.group()
Out[90]: '95 - 99'
In [91]: d = re.search(r'^[0-9]+[ ]*(-[ ]*[0-9]+){0,1}', s1)
In [92]: d.group()
Out[92]: '95-99'
In [93]: d = re.search(r'^[0-9]+[ ]*(-[ ]*[0-9]+){0,1}', s)
In [94]: d.group()
Out[94]: '955 - 959'
字符集0-9
由\d
表示,如此
d = re.search(r'^[\d]+[ ]*(-[ ]*[\d]+){0,1}', s)
这里,在所有示例中,我们在字符串的开头搜索至少一个数字后跟零个或多个空格的序列,并且可选地后跟最多只有一个-
的序列符号后跟零个或多个空格以及至少一个或多个数字。