使用正则表达式从段落中获取地址

时间:2011-10-03 07:58:12

标签: python regex scrapy street-address

好吧,这个有点痛。我正在用Python进行一些搜索,尝试从几行标记不好的HTML中获取地址。以下是格式示例:

256-555-5555<br/>
1234 Fake Ave S<br/>
Gotham (Lower Ward)<br/>

我只想检索1234 Fake Ave S, Gotham。有任何想法吗?我整晚都在做正则表达式,现在我的脑子已经糊涂了......

编辑: 有关数据如何到达的可能方案的更多细节。有时第一行会在那里,有时候不会。我见过的所有地址都有Ave,Way,St,虽然我不愿意将它作为选择中的一个因素,因为我不确定它们总是那样。第二行和第三行是alPhone(或可能的电子邮件或网站):

我想到的是

  1. 选择第二行到最后一行的所有内容(如果有三行,则为第二行,如果没有电话号码,则为第一行,如果只有两行)。
  2. 选择最后一行中不在括号中的所有内容。
  3. 将第2行与最后一行和最后一行合并,在两者之间添加“,”。
  4. 我正在使用Scrapy来获取HTML代码。地址都在同一个div中,我想使用正则表达式进一步将数据分解成适当的部分。现在该怎么做才是我无法弄清楚的。

    EDIT2:

    根据Ofir的评论,我应该提一下,我已经表达了隔离电话号码和括号部分。

    电话(或可能的电子邮件或网站):

    ((1[-. ])?[0-9]{3}[-. ])?\(?([0-9]{3}[-. ][A?([0-9]{4})|([\w\.-]+@[\w\.-]+)|(www.+)|([\w\.-]*(?:com|net|org|us))
    

    括号:

    \((.*?)\)
    

    我不确定如何使用它们来构建一切 - 但是 - 这些声明。

3 个答案:

答案 0 :(得分:1)

在您的情况下,您可能更容易专注于您不想要的内容:

  • html代码(<br>
  • 电话号码
  • 括号中的所有内容

每个都可以通过简单的正则表达式轻松匹配,从而可以轻松构建一个匹配其余的(可能是地址)

答案 1 :(得分:1)

这会尝试将最后两行与字符串隔离开来:

>>> s="""256-555-5555<br/>
... 1234 Fake Ave S<br/>
... Gotham (Lower Ward)<br/>
... """
>>> m = re.search(r'((?!</br>).*)<br/>\n((?!</br>).*)<br/>$)', s)
>>> print m.group(1)
1234 Fake Ave S

修剪括号可能最好留给单独的代码行,而不是进一步使正则表达式复杂化。

答案 2 :(得分:0)

据我了解你的问题,我认为你采取的是错误的解决方法。

正则表达式不是一种神奇的工具,可以从纸浆中提取相关数据,并混淆无差别的文本元素。它是一种工具,它只能从具有可变部分的文本中提取数据,但也可以作为相对于可变部分可以定位的锚点的最小稳定结构。

在您的治疗中,在我看来,您首先将此部分包含可能的电话号码,然后是1/2行的地址。但是这样做,你丢失了信息:之前和之后的内容是锚定信息,你不应该在删除这些信息后尝试在剩下的部分找到一些东西。

此外,我认为您不希望只捕获电话号码和地址:您可能想要提取本节前后的其他信息。凭借良好的塑造正则表达式,您可以一次性捕获所有碎片。

所以,请提供更多的文本,前面有足够的字符,并且在限制部分之后有足够的字符,允许编写正确且更容易的正则表达式策略来捕获所需的所有数据。三联已经问你了,你没有,为什么?