将街道名称与街道号码分开

9 投票
7 回答
24335 浏览
提问于 2025-04-17 02:42

我想把街道名称和街道号码分开,这里有一些例子:

  1. "street 12" --- 名称: street , 号码: 12
  2. "street12" --- 名称: street , 号码: 12
  3. "street 12a" --- 名称: street , 号码: 12a
  4. "street12a" --- 名称: street , 号码: 12a

我想知道在php和python中,分别用什么正则表达式可以提取街道名称和街道号码?

注意:号码总是在街道名称后面,所以我想这应该能简化问题。

谢谢。

7 个回答

6

一般来说,地址并不是总是那么规范。特别是当这些数据直接来自用户时,你要考虑到并不是每个人都有标准的地址。比如有邮政信箱、乡村路线,还有像31 1/2这样的地址,套房,街道类型也有很多变化(比如路、街、环、法庭等等,还有它们的缩写)。街道名称中的空格、房号中的连字符,地址的复杂性很容易被低估。如果再加上非美国地址,复杂程度就更高了。

这个庞大的函数试图理清这些问题(至少在美国邮政的角度来看):http://codepad.org/pkTdUDL6 我手头有这个函数,所以可能需要调整或补充。如果没有别的,它应该能让你了解在处理用户地址数据时所面临的任务。

这也让人想把房号、街道名称和街道类型分成不同的字段。如果解析地址的准确性对你的系统设计至关重要,你可能需要考虑这样做;比如房地产系统就需要对这些数据有这样的细分。如果你的使用场景并不特别依赖于准确解析这些数据,那么我不建议给用户提供那么多额外的字段。只需按照他们提供的地址来处理,尽量清理一下,并在系统设计中预见到一些不一致的情况。

13

我建议判断数字开始的最好方法是当你遇到一个数字时。因此,你可以使用

preg_match('/^([^\d]*[^\d\s]) *(\d.*)$/', $address, $match)

举个例子:

'Bubbletown 145' => 'Bubbletown', '145'
'Circlet56a' => 'Circle', '56a'
'Bloomfield Avenue 68' => 'Bloomfield Avenue', '68'
'Quibbit Ave       999a' => 'Quibbit Ave', '999a'
'Singletown551abc' => 'Singletown', '551abc'

你可能最好先考虑一下你希望如何处理一些特殊情况,然后写一个单元测试来测试你自己的正则表达式函数。

7

试试这个,看看对你是否有效:

$subjects = array( "street 12", "street12", "street 12a", "street12a" );
foreach( $subjects as $subject )
{
    if ( preg_match('/([^\d]+)\s?(.+)/i', $subject, $result) )
    {
       var_dump( $result );
    }
}
die_r( $result  );

你只需要这一部分:

// Find a match and store it in $result.
if ( preg_match('/([^\d]+)\s?(.+)/i', $subject, $result) )
{
    // $result[1] will have the steet name
    $streetName = $result[1];
    // and $result[2] is the number part. 
    $streetNumber = $result[2];
}

撰写回答