【问题标题】:Find all occurrences in string containing HTML查找包含 HTML 的字符串中的所有匹配项
【发布时间】:2017-05-30 12:45:08
【问题描述】:

我有一个包含 HTML 的字符串,例如:

s <- "...<span class=\"pull-right\">170 cm</span>...
<span class=\"pull-right\">29</span>...
<span class=\"pull-right\">06/24/1987</span>..."

其中... 表示中间还有其他HTML 标签。我想提取&gt;&lt;/span&gt;之间的信息,可以是

  • 只有数字
  • 数字和字符(大写或小写或两者兼有)
  • 表格日期mm/dd/yyyy

我想出了这样的正则表达式:

">[0-9/]*[a-z ]*[A-Z]*</span>"

这是正确的吗?如何提取感兴趣的值?也就是说,给定s

170 cm
29
06/24/1987

【问题讨论】:

  • 为什么不使用 XML 工具从 XML (HTML) 标签中提取数据?
  • 那么,您对 HTML 抓取进行了哪些研究?这感觉很像“免费为我编写这段代码”。
  • @989 查看 BeautifulSoup4 以获得更高级的方法。 requests 也很适合。

标签: html r regex string


【解决方案1】:

您最好使用 HTML 解析器。但是,如果您需要一个快速而肮脏的基于正则表达式的解决方案,请使用环视来提取一些打开((?&lt;=&gt;) 用于前面的 &gt;)和关闭((?=&lt;/span&gt;) 用于尾随 &lt;/span&gt;)模式之间的模式:

(?<=>)[0-9/A-Za-z ]*(?=</span>)

请注意0-9/a-zA-Z 组合在一个类中,否则1 Gb 之类的字符串将不匹配(您的原始正则表达式要求大写字母跟在小写字母后面)。

可通过perl=TRUE 获得环视:

m <- gregexpr("(?<=>)[0-9A-Za-z /]*(?=</span>)", s, perl=TRUE)
regmatches(s, m)

演示:https://ideone.com/yvXIuP

【讨论】:

    【解决方案2】:

    这是一个匹配的正则表达式

    170 厘米

    29

    1987 年 6 月 24 日

    (\d{2}\/\d{2}\/\d{4})|(\d+ [A-Za-z]+)|(\d+)
    

    【讨论】:

      猜你喜欢
      • 2023-01-06
      • 2017-11-14
      • 2020-08-21
      • 2017-04-15
      • 1970-01-01
      • 2020-08-07
      • 2013-03-19
      • 2022-01-19
      • 2013-05-13
      相关资源
      最近更新 更多