我正在解析html页面中的字符串,我可以获得特定字符串的多个匹配项。我试图确定字符串何时出现在文本中的特定单词之后,以便我可以拒绝它们。
例如说我试图从页面中提取电话#。可能会有一些,但我不想要在#34; Copyright"之后出现的那个。因为这可以以任何方式构建,因为我想要的#s之前我想要做的事情(实现这是一个完全不完美的手机#仅仅用例子)
((Copyright|©)(*))?([0-9]\d{2,3}(-)[0-9]\d{2,3}(-)[0-9]\d{3,4})
我认为*不是正确的做通配符的方法,但更大的问题是如何设置它以便在捕获手机时#I我还会捕获版权,如果它出现在任何地方,包括:
版权所有1972 Acme Corp 555-555-5555
和
Acme Corp持有的版权
西街123号
NY,NY 10019
Bla bla
问题请致电555-555-5555
理想情况下,我想要捕获的是'版权所有'和' 555-555-5555'没有通配符之间的文本。这样我使用版权所捕获的任何手机#都可以拒绝。
有点OT我明白我也可以做像
这样的事情(?P<Copyright>(Copyright|Trademark|©))(?P<Wildcard>(*))(?P<NUMBER>([0-9]\d{2,3}(-)[0-9]\d{2,3}(-)[0-9]\d{3,4}))
以后更容易识别。
无论如何,我的目标是在版权期限之后发生在htmnl中任何一点发生的电话号码的最简单方法,因此我可以拒绝它。
答案 0 :(得分:1)
只使用正则表达式来解决这种类型的information extraction问题非常困难(如果不是不可能的话)。
如果可能的话,您应该在尝试提取电话号码之前预处理文档。
需要考虑的一些事项:
然后可以使用正则表达式匹配生成的文本。
以下是此预处理步骤对文档执行操作的示例:
<html>
<head>
</head>
<body>
<p style="some css style etc">some <em>arbitrary</em> text here.</p>
<div>
<div>
More complex html nested
tags
</div>
with arbitrary white space including tabs and
new lines.
</div>
<footer class="footer_class">
<p style="css style">Copyright (c) Acme Coropration</p>
<p style="css style">123 West Street<br/>NY, NY 10019<br/>Bla bla</p>
<p style="some other css style">question call us at 555-555-5555</p>
</footer>
</body>
</html>
预处理后:
some arbitrary text here. More complex html nested tags with arbitrary white
space including tabs and new lines. Copyright (c) Acme Corporation 123 West
Street NY, NY 10019 Bla Bla questions call us at 555-555-5555
请注意,通过这种方式,您可以获得可靠的文本块。您可能需要设计一些规则,将此单行文本块分成多行,以便更容易识别您搜索的信息何时与某些关键字连接。
您还可以查看关键字与您要查找的信息之间的距离,并将其用作启发式。