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

2024-05-14 20:33:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将街道名称与具有以下模式的街道编号分开:

  1. “街道12”--名称:街道,编号:12
  2. “街道12”--名称:街道,编号:12
  3. “街道12a”--名称:街道,编号:12a
  4. “街道12a”--名称:街道,编号:12a

在php和python中,获取街道名称的regex是什么,获取街道编号的regex是什么?

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

谢谢。


Tags: 名称模式街道编号regex号码php
3条回答

一般来说,地址并不总是这么干净。尤其是如果这些数据直接来自用户,你必须考虑到不是每个人都有这样的标准地址。有邮政信箱,乡村路线,31 1/2s,套房,街道类型(道路,街道,圆圈,法院等,加上所有缩写)的变化吨。街道名称中的空间,房屋编号中的天花乱坠,地址的复杂性很容易被低估。混合使用非美国地址的可能性,复杂性会成倍增加。

这个巨大的函数试图理解所有这些(至少就美国邮报而言):http://codepad.org/pkTdUDL6我有这个函数,所以它可能需要调整或细化。如果没有其他东西,它应该能让你了解在试图使用户地址数据保持正常时所面临的任务。

这也使得将门牌号、街道名称和街道类型分割成不同的字段变得很有诱惑力。如果解析地址的准确性对您的系统设计至关重要,那么您可能需要考虑它;例如,房地产系统需要对此数据具有这种粒度级别。如果您的用例并不严格依赖于准确分析这些数据的能力,那么我建议不要向用户展示所有这些额外的字段。只要把他们的地址记下来,试着把它清理干净,然后在你的系统的其他设计中预测一些不一致的地方。

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

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

我建议最好的方法来确定什么时候开始的数字是当你击中一个数字。因此,您可以使用

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函数。

相关问题 更多 >

    热门问题