【问题标题】:Using regular expressions to modify a string in R使用正则表达式修改 R 中的字符串
【发布时间】:2018-09-14 15:37:51
【问题描述】:

我已经修剪了一个 html 文件,以使数据集的每个字符向量看起来像:

<h3 class=\"personName\">Whitney  Alicia Zimmerman</h3>                                             <li>Assistant Teaching Professor</li>"

我想使用正则表达式将其缩减为仅名称和位置(为澄清起见,每个向量都有不同的名称和位置)。我之前使用的内容对此不起作用(我使用 grepl 函数对我的原始 html 文件进行子集化)。我将如何使用正则表达式甚至其他技术来修剪它?感谢您提前提供任何帮助。

或者,如果它更容易使用,我还有另外两个字符向量将两者分开,看起来像:

"                                        <h3 class=\"personName\">Whitney  Alicia Zimmerman</h3>"

"                                            <li>Assistant Teaching Professor</li>"

【问题讨论】:

  • 欺骗Parsing HTML file in R?或R Read & Parse HTML to List。在解析 HTML 时,有比使用正则表达式更好的方法。
  • @WiktorStribiżew 这可能更实用。不幸的是,我正在努力为我所在的课程更好地学习正则表达式,并且我正在努力避免用这种方式偷工减料。不过感谢您的建议!

标签: r regex


【解决方案1】:

您可以使用sub 并匹配除您想要的任何内容之外的所有内容。所以我可能会做类似的事情

test = '<h3 class=\\"personName\\">Whitney  Alicia Zimmerman</h3>  '
sub("<.*", "", sub(".*\">", "", test))

[1] "Whitney  Alicia Zimmerman"

可以修改 gsub 表达式以摆脱您想要的任何内容。诀窍是匹配你不想要的东西,并用空字符串替换。

sub 的基本结构是sub(match_string, replace_string, target)。查看文档将进一步清除它。我刚刚嵌套了我的subs,所以我可以删除字符串的开头和结尾。

编辑:我包括了 u/Onyambu 的建议,因为他是完全正确的。只需要sub 而不是gsub,就像我最初建议的那样。区别在于gsub 查找所有匹配项,sub 只查找第一个匹配项。

下面他还提供了一个解决方案,只使用一个sub,而不是像我那样使用两个。

【讨论】:

  • gsub 似乎是一种相对简单的方法来摆脱它周围的所有垃圾。我会尝试更多地使用它,看看我能用它做什么。谢谢
  • 你需要的是sub(".*&gt;(.*)&lt;.*","\\1",test)。你不需要使用g sub ie gsub 但它仍然会给出相同的结果:gsub(".*&gt;(.*)&lt;.*","\\1",test)
  • 好一个!我有一个一直使用gsub 的坏习惯,因为我的大多数匹配都是单数的。我不是正则表达式专家,您能向我解释一下\\1 的工作原理吗?它是否匹配整个字符串,然后在其位置替换第一个(如第 0 个、第 1 个、第 2 个)匹配的令牌或类似的东西?
【解决方案2】:

如果您真的想使用正则表达式,这里有一个使用stringr(以及magrittr)的解决方案:

使用你的长字符串:

htmlstring <- c("<h3 class=\"personName\">Whitney  Alicia Zimmerman</h3>                                             <li>Assistant Teaching Professor</li>")  

代码:

library(stringr)
library(magrittr)

ParsedString <- str_replace_all(htmlstring, "<[^>]+>", "") %>% # remove everything between angle brackets, inclusive
                str_squish # remove all extraneous whitespace

输出:

> ParsedString
[1] "Whitney Alicia Zimmerman Assistant Teaching Professor"

【讨论】:

  • 我真的不想使用正则表达式,但我确实需要一些该领域的基础。但这有助于理解如何使用它们
  • 很高兴为您提供帮助!对于gsub 解决方案,请尝试ParsedString &lt;- gsub("&lt;[^&gt;]+&gt;", "", htmlstring) %&gt;% gsub("\\s{2,}", " ", .)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2014-01-29
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多