删除单个字母字符串

Nat*_*lie 2 r

在字符串数据列中,如何检查每一行是否存在字母并将其删除。

例子

I am a text r r o n n r and here
Run Code Online (Sandbox Code Playgroud)

并将其作为输出

I am a text and here
Run Code Online (Sandbox Code Playgroud)

r2e*_*ans 5

gsub("\\s[A-Za-z](?= )", "", "I am a text r r o n n r and here", perl = TRUE)
# [1] "I am text and here"
Run Code Online (Sandbox Code Playgroud)

由于您想保留 single a,因此可以使用以下任意一种来实现更具体的模式:

### just three letters: r o n
gsub("\\s[orn](?= )", "", "I am a text r r o n n r and here", perl = TRUE)
# [1] "I am a text and here"

### any single-letter except "a" and "i"
gsub("\\s[B-HJ-Zb-hj-z](?= )", "", "I am a text r r o n n r and here", perl = TRUE)
# [1] "I am a text and here"
Run Code Online (Sandbox Code Playgroud)

i(这里并不严格需要第二个示例中的例外,但作为示例提供。)

使用“前瞻” ((?= )是因为您规定了前后空格的要求;如果您使用 的模式"\\s[orn]\\s",那么它将错过许多单个字母(由于递归替换)。如果您放松这一点,然后你可以使用单词边界,如

gsub("\\s[B-HJ-Zb-hj-z]\\b", "", "I am a text r r o n n r and here")
Run Code Online (Sandbox Code Playgroud)

(虽然使用 perl 风格的正则表达式在技术上会带来性能损失,但我怀疑,只有当你做了很多事情并且需要尽可能提高性能时,这才真正重要。不是严格要求的,早期优化是“根源”一切邪恶” ——唐纳德·高德纳 (Donald Knuth )

i注意:在最后一个模式中,除了大写字母之外,我还排除了小写字母I;如果您确信您永远不会看到其他有效的i,那么您可以调整您的模式来代替[B-HJ-Zb-z]。(感谢@jay.sf 强调了这一假设。)