好吧,这个有点痛。我正在用Python进行一些搜索,尝试从几行标记不好的HTML中获取地址。以下是格式示例:
256-555-5555<br/>
1234 Fake Ave S<br/>
Gotham (Lower Ward)<br/>
我只想检索1234 Fake Ave S, Gotham
。有任何想法吗?我整晚都在做正则表达式,现在我的脑子已经糊涂了......
编辑: 有关数据如何到达的可能方案的更多细节。有时第一行会在那里,有时候不会。我见过的所有地址都有Ave,Way,St,虽然我不愿意将它作为选择中的一个因素,因为我不确定它们总是那样。第二行和第三行是alPhone(或可能的电子邮件或网站):
我想到的是
我正在使用Scrapy来获取HTML代码。地址都在同一个div中,我想使用正则表达式进一步将数据分解成适当的部分。现在该怎么做才是我无法弄清楚的。
EDIT2:
根据Ofir的评论,我应该提一下,我已经表达了隔离电话号码和括号部分。
电话(或可能的电子邮件或网站):
((1[-. ])?[0-9]{3}[-. ])?\(?([0-9]{3}[-. ][A?([0-9]{4})|([\w\.-]+@[\w\.-]+)|(www.+)|([\w\.-]*(?:com|net|org|us))
括号:
\((.*?)\)
我不确定如何使用它们来构建一切 - 但是 - 这些声明。
答案 0 :(得分:1)
在您的情况下,您可能更容易专注于您不想要的内容:
<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行的地址。但是这样做,你丢失了信息:之前和之后的内容是锚定信息,你不应该在删除这些信息后尝试在剩下的部分找到一些东西。
此外,我认为您不希望只捕获电话号码和地址:您可能想要提取本节前后的其他信息。凭借良好的塑造正则表达式,您可以一次性捕获所有碎片。
所以,请提供更多的文本,前面有足够的字符,并且在限制部分之后有足够的字符,允许编写正确且更容易的正则表达式策略来捕获所需的所有数据。三联已经问你了,你没有,为什么?