我正在尝试将街道名称与具有这些模式的街道号码分开:
获取街道名称的正则表达式是什么,以及在php和python中获取街道号码的正则表达式是什么?
注意:号码总是在街道名称之后,所以我想这应该缩短它。
感谢。
答案 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:]-/] *)$#';
此解决方案适用于类似的街道
完美!
答案 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;
}