如何grep以特定标点符号结尾的字符串

How to grep a string ending in a specific punctuation mark

我试图在 R 中 grep 以破折号结尾的字符串,但遇到了问题。我已经弄清楚了如何 grep 以任何标点符号结尾的字符串,这可能不是最好的方法,但这个方法有效:

grep("\#[[:print:]]+[[:punct:]]$",c)

我这辈子都想不出如何 grep 专门以破折号结尾的字符串 例如这些字符串:

 - # (piano) - not this.
 - # hello hello - not this either.

我想将破折号(包括破折号)之间的所有内容都去掉,不带任何 "",并将文本留在第二个破折号的右侧,以句号结尾。所以,我希望输出是(例如,基于上面的例子):

不是这个。

也不是这个。

如有任何帮助,我们将不胜感激。

谢谢!

马罗


更新: 大家好, 我只是再次更新我原来的问题:

所以我的原始数据中有这三个示例(我试图在上面的原始 post 中进行简化,但我认为这可能对大家了解我实际处理的内容有所帮助):

  1. - # (Piano) - no, and neither can you.
  2. - # (Piano) - uh-huh.
  3. - # Many dreams ago - Try it again.

(数字1-3是为了让事情更清楚,它们不是字符串的一部分)

我试图找到一种方法来删除两个破折号之间(包括两个破折号)之间的所有内容,并在第二个破折号之后保留所有内容,所以我希望我的输出是:

  1. 不行,你也不行。
  2. 嗯嗯。
  3. 再试一次。

我最终使用了这个:

gsub(("-[[:blank:]]#[[:blank:]]\(?[A-Z][a-z]*\)?[[:blank:]]-", "", c) 

这帮助我一次性获得了 1. 和 2.。但这对 3 没有帮助——我认为通过在左括号和右括号后加上问号(我认为这意味着 'optional')这将帮助我获得所有三个目标,但由于某种原因它没有.然后得到 3,我最终只针对那个特定的字符串,即 - # Many dreams ago -,通过使用:

gsub(("- # Many dreams ago -"), "", c) 

我是新手,所以我确定这不是最好的解决方案。

在我原来的 post 中(这已经被编辑了几次)我在三个字符串周围加上了方括号,这解释了我最初从社区成员那里收到的一些答案。很抱歉造成混淆!

谢谢大家 - 如果有任何不明白的地方,请告诉我,我会尽力澄清。

马罗

如果你想留在方括号之间,你可以在 # 开始匹配,然后使用否定字符 class [^][]* 匹配除了开头或以外的可选字符右方括号,并匹配最后一个 -

用空字符串替换匹配项。

c <- "[- # (piano) - not this.]"
sub("#[^][]*-", "", c)

输出

[1] "[-  not this.]"

为了更具体地匹配该字符串格式,您可以匹配整行,包括方括号、# 和以句号结尾的字符串,并捕获您想要保留的内容。

在替换中使用捕获组值。

c <- c("[- # (piano) - not this.]", "[- # hello hello - not this either.]")
sub("\[[^][#]*#[^][]*-\s*([^][]*\.)]", "\1", c)

输出

[1] "not this."        "not this either."