当前位置: 首页 > 知识库问答 >
问题:

使用gsub从字符串中删除模式:参数“pattern”的长度大于1,将只使用第一个元素

秦才
2023-03-14

我试图从下面的< code>chr数组中用gsub删除字符串中的模式

articles<-c("RT @name1: hello world", "@nickname1: bye bye guys", 
"RT @name2_surname2: I have no text", "Hello!")

模式由@之间的术语形成,仅在以RT开头的字符串中。因此,在我们的例子中,模式是:

 "name1"    "name2_surname2"

该模式可以通过使用

pat <- "^RT.*?@(.*?):.*"
res <- gsub(pat,"\\1",articles[grepl(pat,articles)])

去除此图案后,期望的结果是这样的:

"RT : hello world", "@nickname1: bye bye guys", 
"RT : I have no text", "Hello!"

无论如何,当我使用:

gsub(res,"",articles)

我得到了一个错误的结果:

[1] "RT @: hello world"                  "@nick: bye bye guys"               
[3] "RT @name2_surname2: I have no text" "Hello!"                            
Warning message:
In gsub(res, "", articles) :
  argument 'pattern' has length > 1 and only the first element will be used

共有2个答案

章玮
2023-03-14

我们可以模式粘贴到单个字符串中,并在gsub模式中使用它,因为模式参数没有矢量化,即,它只需要1的长度

gsub(paste0("\\b(", paste(res, collapse="|"),  ")\\b"), "", articles)
#[1] "RT @: hello world"        "@nickname1: bye bye guys" "RT @: I have no text"     "Hello!"      
赵嘉悦
2023-03-14

如果所需输出如所述:

"RT : hello world", "@nickname1: bye bye guys", "RT : I have no text", "Hello!"

则此解决方案有效:

首先,您需要更改模式以在捕获组中包含@

pat <- "^RT.*?(@.*?):.*"
res <- gsub(pat,"\\1",articles[grepl(pat,articles)])

然后,按照@Akrun的建议,您可以将 res的两个矢量元素粘贴在一起,这允许您将其用作(单个)模式:

gsub(paste0(res, collapse = "|"), "", articles)

这将为您提供不可靠的输出。

 类似资料:
  • 我有以下问题。 如何创建一个名为<code>word</code>的新列,其中仅包含<code>col2</code<中未出现的值?

  • 我在 ifelse 语句中使用带有因子变量的 grepl 不断收到此警告:“参数'模式'有长度 我有这些变量:x7和y7。x7是一个互斥的字符变量,y7是一个不互斥的因子变量,因此是一串数字(0到9)。 x7可以以任何字母结尾,但我想限制为等于Z或J。如果它等于Z,我希望y7以字符串(0,1,2,3,4)中的任何这些值结尾。 下面是我写的: 因此,如果x7是Z,y7是0:4,或者如果x7是J,它是

  • 我正在努力删除字符串中下划线前的子字符串。我想使用*(通配符)作为下划线可以变化之前的位: 结果应该是: 我也尝试过类似“^*”或“?”之类的东西但并没有真正奏效。

  • 问题内容: 我想删除字符串的第一个字符。 例如,我的字符串以a开头,而我只想删除它。字符串中有几次不应删除。 我正在用Python编写代码。 问题答案: python 2.x python 3.x 两张画

  • 问题内容: 如何从字符串中删除除数字以外的所有字符? 问题答案: 在Python 2. *中,到目前为止最快的方法是: 生成一个转换表(长度为256的字符串),在这种情况下,该转换表与(更快地制作;-)相同。应用转换表(这里无关紧要,因为本质上是指身份),并删除第二个参数(关键部分)中存在的字符。 在Unicode字符串(和Python 3中的字符串)上的工作方式大不相同-我 确实 希望指出问题是

  • 我有以下问题:我正在从一个UTF-8文本文件中读取(我告诉Perl,我是通过“:编码(utf-8)”)。 该文件在十六进制查看器中看起来像这样:EF BB BF 43 6F 6E 66 65 72 65 6E 63 65 印刷时翻译成“∩会议”。我知道我被警告的“宽字符”是物料清单。我想摆脱它(不是因为警告,而是因为它搞砸了我稍后进行的字符串比较)。 因此,我尝试使用以下代码删除它,但失败惨重: