Regex 字符串的perl正则表达式

Regex 字符串的perl正则表达式,regex,perl,string-parsing,scraper,Regex,Perl,String Parsing,Scraper,我有一个字符串,需要从中提取街道、城市、州、邮政编码 字符串可能看起来像 a)$str1 ="2500 South 3850 West Suite A Salt Lake City, UT 84120-7225"; b)$str2 ="19701 DaVinci Lake Forest, CA 92610"; c)$str3="abc ,def ,ca 1234"; -->(note there are two commas in this one) 我目前正

我有一个字符串,需要从中提取街道、城市、州、邮政编码

字符串可能看起来像

    a)$str1  ="2500 South 3850 West Suite A Salt Lake City, UT 84120-7225";
    b)$str2 ="19701 DaVinci  Lake Forest, CA 92610";
    c)$str3="abc ,def ,ca 1234"; -->(note there are two commas in this one)
我目前正在使用split函数获取一个数组,并将这些值用于我的工作,但我需要一个正则表达式来为我完成这项任务。如果有任何帮助,我将不胜感激。 谢谢,通常位置都是,我很有信心,即使您找到了一个适合您的测试用例的位置,您也很可能会遇到您的正则表达式不正确匹配的情况

解析地址非常困难,因为您永远无法完全确定哪个字符串将与哪个部分匹配

有些城市有数字。具有特殊特征的街道。唯一接近常规的是zipcode,您可以相当安全地提取它,但是仅当它始终位于字符串的末尾时

除此之外,您还必须将字符串与某种地址数据库进行匹配,以了解您提取的城市/街道是否存在。

我同意w/Florian:一旦您使用正则表达式,您将引入一个新字符串,该字符串将无法工作,您的程序将停止运行

话虽如此,下面是一个正则表达式,它将适用于您的示例:


但它无法解析城市,因为地址中的逗号不一致。

您需要提供精确的解析算法。请显示您现在使用的代码。那会有很大帮助。您所定义的问题看起来不明确。例如,您如何知道城市名称是“盐湖城”,而不是“西湖城”、“湖城”或“城市”?您如何准确地识别您的
街道、城市和州
?格式不固定,正则表达式不可能是解决方案。Hm。地址和名称解析是一个极其复杂的领域,因为这种方法基本上是蛮力。有一些公司在做这些事情上过着公平的生活。
[\t]*
可以被简单的
\s*
所取代。是的,弗洛里安,谢谢你的洞察力。我认为这更合适。
#!/usr/bin/perl
use strict;
use warnings;

my $addr1 = "2500 South 3850 West Suite A Salt Lake City, UT 84120-7225";
my $addr2 = "19701 DaVinci  Lake Forest, CA 92610";
my $addr3 = "abc ,def ,ca 1234";

for my $addr($addr1,$addr2,$addr3){
  $addr =~ m/^(.*),[ \t]*([a-zA-Z]{2})[ \t]([0-9\-]*)$/;
  print "\naddr : '$1'\n";
  print "state: '$2'\n";
  print "zip  : '$3'\n";
}