Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将街道名称与街道编号分开_Php_Python_Regex_Preg Replace - Fatal编程技术网

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

Php 将街道名称与街道编号分开,php,python,regex,preg-replace,Php,Python,Regex,Preg Replace,我试图将街道名称与具有以下模式的街道编号区分开来: “12号街”——名称:街道,编号:12 “街道12”——名称:街道,编号:12 “街道12a”--名称:街道,编号:12a “street12a”--名称:street,编号:12a 在php和python中,获取街道名称的正则表达式是什么,获取街道编号的正则表达式是什么 注意:号码总是在街道名称之后,所以我想应该缩短它 谢谢。假设只有最后一封信 if (preg_match('/^(.+) *(\d+[a-z]?)$/', $address,

我试图将街道名称与具有以下模式的街道编号区分开来:

  • “12号街”——名称:街道,编号:12
  • “街道12”——名称:街道,编号:12
  • “街道12a”--名称:街道,编号:12a
  • “street12a”--名称:street,编号:12a
  • 在php和python中,获取街道名称的正则表达式是什么,获取街道编号的正则表达式是什么

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


    谢谢。

    假设只有最后一封信

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

    一般来说,地址并不总是这么干净。特别是如果这些数据是直接来自用户的,你必须考虑到并不是每个人都有这样的标准地址。有邮政信箱、乡村路线、
    31 1/2
    s、套房、街道类型的千变万化(道路、街道、环路、法院等,以及所有缩写)。街道名称中的空格,门牌号中的宣传,地址的复杂性很容易被低估。如果混入非美国地址的可能性,复杂性就会呈指数级增长

    这个巨大的函数试图解释所有这些(至少就《美国邮报》而言):我有这个函数,所以它可能需要调整或细化。如果没有其他问题,它应该让您了解在试图使用户地址数据正常时所面临的任务


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

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

    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'
    

    您最好考虑如何处理边缘情况,然后编写一个单元测试来测试您自己的正则表达式函数。

    试试这个,看看它对您是否有用:

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

    解析街道地址会变得非常糟糕,非常快。最可靠、无需担心的方法是使用一种服务,该服务可以根据完整的配送点条形码(9位邮政编码+3位配送点)解析地址组件

    我在一家地址验证公司工作,我们有一个API可以为您解析这些组件。看这个。只需一个简单的GET请求,就会得到一个JSON结果,其中包含为您解析的所有地址组件


    更新:SmartyStreets现在提供。

    可能是旧版本,但参考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),同时仍检测包括数字的街道(如第五大道123号,Straße des 17.Juni 123)

    对于德国的街道地址,最佳工作解决方案是(如@所述)。只需做一点小黑客检测“ß”字符以及

    而不是

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

    你应该使用

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

    此解决方案适用于以下街道:

    • Manfred Hirschvogel Straße 6博士
    • 威斯12
    • Kirchenstr。七,
    • 斯特拉埃150 13
    • 马格德伯格阿莱12a

    太好了

    是否会发生以下情况:
    Strasse des 17。Juni 153
    ?(德国柏林的有效街道地址)在这种情况下,他应该将其模块化,这样他可以根据需要为每个国家设置不同的正则表达式。棘手的部分是你有数字的街道,比如“32街”。。。或者10ème de Line大道12号。。。过于简单化会让邮递员不高兴。我想知道谷歌、必应和雅虎等搜索引擎是如何做到这一点的?你的例子和书面解释确实应该提供更多关于需要匹配的内容的信息——一般来说,尽管表达式
    /^(?P[a-zA-Z]+)\s*(?P[a-zA-Z0-9]+)$/
    将为您提供的示例将名称和编号捕获到命名组中。如果街道名称不止一个词,它会变得复杂一点,但仍然很容易实现。但他确实指出,他使用的数据总是这样的,我认为这意味着他一般不会使用这个词。我假设那句话是一个假设:)这正是我需要的。谢谢很高兴知道我能帮忙。我假设你用它来修正一组有限的数据,而不是长期的。最好的解决方案是在。因为这个解决方案不适用于编号为“straße des 17 juni”的街道名称FWIW,我专业使用,并推荐Smarty Streets。