在Regex中使用通配符

时间:2014-05-13 18:21:24

标签: regex wildcard

我正在解析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中任何一点发生的电话号码的最简单方法,因此我可以拒绝它。

1 个答案:

答案 0 :(得分:1)

只使用正则表达式来解决这种类型的information extraction问题非常困难(如果不是不可能的话)。

如果可能的话,您应该在尝试提取电话号码之前预处理文档。

需要考虑的一些事项:

  • 删除所有HTML标记(即删除所有标记标记并替换为空格)
  • 转换&amp;规范化所有空白区域

然后可以使用正则表达式匹配生成的文本。


以下是此预处理步骤对文档执行操作的示例:

 <html>
   <head>

   </head>

   <body>
      <p style="some css style etc">some <em>arbitrary</em> text&nbsp;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

请注意,通过这种方式,您可以获得可靠的文本块。您可能需要设计一些规则,将此单行文本块分成多行,以便更容易识别您搜索的信息何时与某些关键字连接

您还可以查看关键字与您要查找的信息之间的距离,并将其用作启发式。