【问题标题】:gsub Find and replace text between two strings in Rgsub 在 R 中的两个字符串之间查找和替换文本
【发布时间】:2020-04-16 15:36:57
【问题描述】:

我必须在包含文本的列的 1000 行中使用 gsub 函数。在每一行中,我想删除出现在“说:”和“点击展开...”之间的每个单词,因为它们只是之前推文的副本。我正在尝试使用gsub 来完成我的任务

content2<-as.data.frame(gsub(".*said:(.*?)expand.... *", " ", content2$txt,fixed=TRUE),stringsAsFactors = FALSE);

但是,它只是删除“说:”并展开。 content2 是对 1 个变量数据框的 100 次观察,我必须为每一行完成任务。在wiktor回复之后,我试图查看他写的那行是否有效。我仍然可以看到说:并单击以展开....在第 35 行中,所以,wiktor 的代码仅适用于我猜的第一行(无论如何不包含要删除的行)。我尝试使用 apply 未成功地将其应用于每一行,如下所示,b3eside 太慢,它给了我其他错误:

ops<-apply(content2,1,gsub("(said:).*?(click to expand\\.{3})", "\\1 \\2", content2,fixed=TRUE))

刚刚浏览了重复的帖子,它没有回答我的问题,即:如果我想替换模式之间的所有字符我应该怎么做假设我想替换“说:”和“点击到”之间的所有字符串expand" 用于 100X1 数据框的所有行。所有行都包含一组字符串,输出应该是尺寸为 100X1 的数据框: ops&lt;-gsub("(said:).*?(click to expand\\.{3})", "\\1 \\2", test)

@WiktorStribiżew 谢谢它似乎唯一有效的问题我也想删除“说:”和“点击展开......”我制作了以下可重现的代码,你可以看到“说:”和“点击展开...... “没有被删除。

test<-as.data.frame(c("he said: i wanna be a rockstar click to expand....ok great but how you gonna do it", 
                      "rockstar said: so how you gonna do it click to expand.... we are wanna be a big rockstar, hang out in collest bar vip with movie star"),stringsAsFactors=FALSE)
ops<-lapply(test, gsub, pattern = '(said:).*?(click to expand\\.{3})', replacement ="\\1 \\2", perl=TRUE)
ops<-as.data.frame(ops,stringsAsFactors = FALSE)

【问题讨论】:

  • 感谢您的帮助
  • @WiktorStribiżew 您编写的代码将适用于 content2 数据帧的所有列。我忘了提到 content2 是一个 20,000 obs 的数据框。 1 个变量,我想将该方法应用于 content2 的每一行。我已经尝试使用应用不成功。我会改变我的原始问题,因为我认为现在还不清楚。谢谢!!
  • 那你需要content2[] &lt;- lapply(content2, gsub, pattern = '(said:).*?(click to expand\\.{3})', replacement ="\\1 \\2")
  • 你不应该使用fixed=TRUE,你从哪里复制的?您需要正则表达式,而不是纯文本替换,请再次检查重复项。威尔逊是谁?
  • 我的错...想标记你。我使用了正则表达式(正则表达式,用于模式匹配)........在 str_replace_all 上重复工作,不过会再次检查它。再次感谢。

标签: apply entity-relationship gsub regex-group regex-greedy


【解决方案1】:

要从您可能使用的数据框中的所有列中删除从said: 到最左边的click to expand... 的所有子字符串

content2[] <- lapply(content2, gsub, pattern = '(?s)said:.*?click to expand\\.{3}', replacement =" ", perl=TRUE)

PCRE 正则表达式(注意 perl=TRUE 启用 PCRE 引擎)匹配:

  • (?s) - 启用 . 以匹配换行符(默认情况下不匹配)
  • said: - 一个字符串(为了匹配它作为一个完整的单词在前面添加\b
  • .*? - 任何 0+ 个字符,尽可能少
  • click to expand\.{3} - click to expand... 子字符串(\.{3} 匹配 . 字符三次)。

【讨论】:

猜你喜欢
  • 2021-10-14
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2021-10-30
  • 2021-07-23
  • 2019-12-25
  • 1970-01-01
相关资源
最近更新 更多