如何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 中进行简化,但我认为这可能对大家了解我实际处理的内容有所帮助):
- # (Piano) - no, and neither can you.
- # (Piano) - uh-huh.
- # Many dreams ago - Try it again.
(数字1-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."
我试图在 R 中 grep 以破折号结尾的字符串,但遇到了问题。我已经弄清楚了如何 grep 以任何标点符号结尾的字符串,这可能不是最好的方法,但这个方法有效:
grep("\#[[:print:]]+[[:punct:]]$",c)
我这辈子都想不出如何 grep 专门以破折号结尾的字符串 例如这些字符串:
- # (piano) - not this.
- # hello hello - not this either.
我想将破折号(包括破折号)之间的所有内容都去掉,不带任何 "",并将文本留在第二个破折号的右侧,以句号结尾。所以,我希望输出是(例如,基于上面的例子):
不是这个。
和
也不是这个。
如有任何帮助,我们将不胜感激。
谢谢!
马罗
更新: 大家好, 我只是再次更新我原来的问题:
所以我的原始数据中有这三个示例(我试图在上面的原始 post 中进行简化,但我认为这可能对大家了解我实际处理的内容有所帮助):
- # (Piano) - no, and neither can you.
- # (Piano) - uh-huh.
- # Many dreams ago - Try it again.
(数字1-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."