使用regex从段落中获取地址

2024-04-29 14:11:34 发布

您现在位置:Python中文网/ 问答频道 /正文

有点疼。我正在使用Python进行一些抓取,试图从几行标记错误的HTML中获取地址。以下是格式示例:

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

我只想检索1234 Fake Ave S, Gotham。有什么想法吗?我整晚都在做regex,现在我的脑子乱七八糟。。。在

编辑: 更详细地说明数据将如何到达的可能场景。有时第一条线会在那里,有时不会。我看到的所有地址都有Ave,Way,St,尽管我不想把它作为选择的一个因素,因为我不确定它们会一直这样。第二行和第三行是alPhone(或可能的电子邮件或网站):

我的想法是

  1. 选择第二行到最后一行的所有内容(因此,如果有三行,则选择第二行;如果没有电话号码,则选择第一行(如果只有两行)。在
  2. 选择最后一行中不在括号中的所有内容。在
  3. 合并第二行到最后一行和最后一行,在这两行之间加一个“,”。在

我用Scrapy来获取HTML代码。地址都在同一个div中,我想使用regex将数据进一步分解成适当的部分。我不知道该怎么做。在

编辑2:

根据Ofir的评论,我应该提到我已经用表达式来隔离电话号码和括号部分。在

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

^{pr2}$

括号:

\((.*?)\)

我不知道如何使用这些来构造除了这些语句之外的所有内容。在


Tags: 数据标记br编辑内容网站电子邮件地址
3条回答

在这种情况下,你不想集中精力做什么

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

其中的每一个都可以用简单的正则表达式轻松匹配,从而很容易构造一个匹配其余的表达式(大概是地址)

据我所知,你解决问题的方法不对。在

正则表达式并不是一个神奇的工具,它可以从杂乱无章的文本元素中提取相关数据。它是一种工具,它只能从文本中提取数据,而文本中有可变部分,但也有最小的稳定结构作为锚,变量部分可以相对于文本进行本地化。在

在你的治疗中,在我看来,你首先隔离了这一部分,它包含可能的电话号码,然后是地址的1/2行。但是这样做,你就丢失了信息:之前是什么,之后是什么是锚定信息,你不应该试图在删除这些信息后获得的剩余部分中找到一些东西。在

此外,我假设您不只是想捕获一个电话号码和一个地址:您可能希望提取出本节前后的其他信息。使用一个形状良好的正则表达式,您可以一次捕获所有片段。在

所以,请给出更多的文本,在有限的部分前面有足够的字符,后面有足够的字符,这样就可以编写一个正确、更简单的regex策略来捕获所有需要的数据。triplee已经问过你了,你没有,为什么?在

这将尝试从字符串中隔离最后两行:

>>> 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

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

相关问题 更多 >