0

我试图只匹配一系列地址中的街道名称。地址可能如下所示:

23桶路。

14 老磨坊博士

65-345 霍华德的虚张声势

我想使用正则表达式来匹配“Barrel”、“Old Mill”和“Howard's”。我需要弄清楚如何排除最后一个词。到目前为止,我有一个排除数字的后视方法,我可以使用以下方法包含单词和空格以及“'”:

(?<=\d\s)(\w|\s|\')+

如何排除最后一个词(可能以句点结尾,也可能不以句点结尾)?我想我应该使用前瞻,但我不知道如何制定它。

4

4 回答 4

0

我相信你想要的前瞻是(?=\s\w+\.?$).

\s:您不想包含最后一个空格 \w:至少一个单词字符(AZ、az、0-9 或 '_') \.?:可选句点(对于“St.”等缩写词) $:确保这是最后一个字

如果有可能在换行符之前可能有额外的空格,只需将其更改为(?=\s\w+\.?\s*$).

于 2013-01-31T22:32:34.770 回答
0

您不需要对此进行回顾:

/^[-\d]+ ([\w ']+) \w+\.?$/
  • 匹配一个或多个数字和连字符
  • 空间
  • 将字母、数字、空格、撇号匹配到捕获组 1
  • 空间
  • 匹配最后一个单词和一个可选的句点

一个示例 Ruby 实现:

regex = /^[-\d]+ ([\w ']+) \w+\.?$/

tests = [ "23 Barrel Rd.",  "14 Old Mill Dr.", "65-345 Howard's Bluff" ]

tests.each do |test|
  p test.match(regex)[1]
end

输出:

"Barrel"
"Old Mill"
"Howard's"
于 2013-01-31T22:33:29.420 回答
0

为什么不只匹配你想要的?如果我理解得很好,你需要得到数字后面的所有单词,不包括最后一个单词。单词由空格分隔,因此只需获取数字和最后一个空格之间的所有内容。

例子

\d+(?:-\d+)? ((?:.)+) 注意:末尾有空格。

Tha 最终会得到你想要的 \1 N 次。

如果您只想匹配您可能使用的确切文本\K(并非每个正则表达式引擎都支持)但是:示例

使用正则表达式\d+(?:-\d+)? \K.+(?= )

于 2013-01-31T22:36:49.143 回答
0

另一种选择是使用split()大多数脚本语言中提供的功能。这是您想要的 Python 版本:

stname = address.split()[1:-1]

(这address是原始地址行,stname是街道名称,即您要提取的内容。)

于 2013-01-31T22:44:32.040 回答