识别字符串

时间:2017-05-05 01:11:48

标签: regex

我有一份地址列表,目前非常不干净。他们采用以下格式:

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]+)

适用于两位数地址,但不适用于三位或一位数地址。

由于

4 个答案:

答案 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

Demo

说明:

/^(\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)

这里,在所有示例中,我们在字符串的开头搜索至少一个数字后跟零个或多个空格的序列,并且可选地后跟最多只有一个-的序列符号后跟零个或多个空格以及至少一个或多个数字。