将街道名称与街道号码分开
我想把街道名称和街道号码分开,这里有一些例子:
- "street 12" --- 名称: street , 号码: 12
- "street12" --- 名称: street , 号码: 12
- "street 12a" --- 名称: street , 号码: 12a
- "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];
}