街道名称与街道号码分开

时间:2011-09-20 16:31:26

标签: php python regex preg-replace

我正在尝试将街道名称与具有这些模式的街道号码分开:

  1. “street 12”---名称:street,number:12
  2. “street12”---姓名:街道,编号:12
  3. “street 12a”---姓名:street,number:12a
  4. “street12a”---姓名:street,number:12a
  5. 获取街道名称的正则表达式是什么,以及在php和python中获取街道号码的正则表达式是什么?

    注意:号码总是在街道名称之后,所以我想这应该缩短它。

    感谢。

8 个答案:

答案 0 :(得分:7)

我建议确定数字何时开始的最佳方法是点击数字。因此,您将使用

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'

最好考虑如何处理边缘情况,然后编写单元测试来测试自己的Regex函数。

答案 1 :(得分:4)

一般来说,地址并不总是这么干净。特别是如果这些数据直接来自用户,您必须考虑并非每个人都有这样的标准地址。有邮政信箱,乡村路线,31 1/2 s,套房,街道类型(道路,街道,圆形,庭院等等)及其所有缩写的大量变化。街道名称的空间,门牌号码的大肆宣传,地址的复杂性很容易被低估。混合非美国地址的潜力,复杂性呈指数级增长。

这个巨大的功能试图理解所有这些(至少就美国邮政而言):http://codepad.org/pkTdUDL6我有这个功能,所以它可能需要调整或详细说明。如果不出意外,它应该让您了解在尝试使用户地址数据合理时所面临的任务。

这也很容易将门牌号,街道名称和街道类型拆分为单独的字段。如果解析地址的准确性对您的系统设计至关重要,您可能需要考虑它;例如,房地产系统需要具有这种数据的粒度级别。如果您的用例并不严格依赖于准确解析此数据的能力,那么我建议不要向用户提供所有这些额外字段。只要拿出他们提供的地址,尝试清理它,并预测系统其余设计中的一些不一致。

答案 2 :(得分:2)

试试这个,看看它是否适合你:

$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];
}

答案 3 :(得分:1)

对于德国的街道地址,最佳的解决方案是https://gist.github.com/benvds/350404(例如提到的@ ZFNerd)。只需进行一些修改即可检测“ß”字符。

代替

  

'#^([\ w [:punct:]] +)([0-9] {1,5})([\ w [:punct:]-/] *)$#';

您应该使用

  

'#^([\ w \ß[:punct:]] +)([0-9] {1,5})([\ w [:punct:]-/] *)$#';

此解决方案适用于类似的街道

  • Manfred-Hirschvogel-Straße6博士
  • Waitzinger Wiese 12
  • Kirchenstr。 7
  • Straße150 13
  • Magdeburger Allee 12a

完美!

答案 4 :(得分:0)

假设最后只能有一个字母,

if (preg_match('/^(.+) *(\d+[a-z]?)$/', $address, $match)) {
   list($street, $number) = $match;
}

答案 5 :(得分:0)

解析街道地址可能会变得令人讨厌,非常快。最可靠,最无忧的方法是使用可以根据完整的交付点条形码(9位邮政编码+ 3位数字交付点)解析地址组件的服务。

我为地址验证公司SmartyStreets工作,我们有一个可以为您解析这些组件的API。见sample。只是一个简单的GET请求,你得到了一个JSON结果,其中包含了为你解析的所有地址组件。

更新:SmartyStreets现在提供international address verification

答案 6 :(得分:0)

可能是旧的,但是参考Pekka的评论我会在b01代码中使用以下正则表达式:

/(.+?)\s?([\d]+[\D]*)$/i

所以完整的代码将是

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

选择最后发生的数字,包括以下字符(例如15F / 15F),同时仍然检测包含数字的街道(如第5大道123号,Straßedes17. Juni 123)

答案 7 :(得分:-1)

#45,Villiams Road, 科伦坡6。 10000。

<?php

function addressDevider($str)
{
    $address = explode(',', $str);


    $j=1;
    $k=2;
    $l=3;
    $m=4;
    $n=5;
    $o=6;
    $p=7;
    $q=8;

    $realAddress= $str;

    if ($j == count($address)) {
        $realAddress = $address[0];
    } elseif ($k == count($address)) {
        $realAddress = $address[0].', '.$address[1];
    } elseif ($l == count($address)) {
        $realAddress = $address[0].', '.$address[1].',<br/>'.$address[2];
    } elseif ($m == count($address)) {
        $realAddress = $address[0].', '.$address[1].',<br/>'.$address[2].', '.$address[3];
    } elseif ($n == count($address)) {
        $realAddress = $address[0].', '.$address[1].',<br/>'.$address[2].', '.$address[3].'<br/>'.$address[4];
    } elseif ($o == count($address)) {
        $realAddress = $address[0].', '.$address[1].',<br/>'.$address[2].', '.$address[3].'<br/>'.$address[4].'<br/>'.$address[5];
    } elseif ($p == count($address)) {
        $realAddress = $address[0].', '.$address[1].',<br/>'.$address[2].', '.$address[3].'<br/>'.$address[4].'<br/>'.$address[5].'<br/>'.$address[6];
    } elseif ($q == count($address)) {
        $realAddress = $address[0].', '.$address[1].',<br/>'.$address[2].', '.$address[3].'<br/>'.$address[4].'<br/>'.$address[5].'<br/>'.$address[6].'<br/>'.$address[7];
    }

    return $realAddress;
}