【问题标题】:regex misunderstanding in rr中的正则表达式误解
【发布时间】:2016-05-26 14:25:49
【问题描述】:

我似乎不了解 gsub 或 stringr。 示例:

 > a<- "a book"

> gsub(" ", ".", a)

[1] "a.book"

好的。但是:

> a<-"a.book"

> gsub(".", " ", a)

[1] "      "

我会预料到的

“一本书”

我将句号替换为空格。

另外:srintrstr_replace(a, ".", " ") 返回:

" .book"

str_replace_all(a, ".", " ") 返回

" "

我可以使用stringi:stri_replace(a, " ", fixed="."):

"a book"

我只是想知道为什么 gsub(和 str_replace)没有像我预期的那样工作。它们在用另一个字符替换空格时起作用,但反之则不行。

【问题讨论】:

  • 将点转义为gsub("\\.", " ", a)。否则,它将被视为匹配所有内容的正则表达式。
  • gsub('.', ' ', a, fixed = TRUE)
  • gsubpattern 参数的文档中的第一个单词是“包含正则表达式的字符串”,其中regular expression 实际上是指向另一个主题的链接。我建议你阅读它。
  • 好的,谢谢,这是有道理的。我已经使用了一些它们以及像“\ n”这样的引号作为新行。我只是不知道“。”是一个正则表达式。

标签: r gsub stringr stringi


【解决方案1】:

这是因为gsub 的第一个参数,即pattern 实际上是一个正则表达式。在正则表达式中,句点. 是一个元字符,它匹配任何单个字符,请参阅?base::regex。在您的情况下,您需要通过以下方式转义句点:

gsub("\\.", " ", a)

【讨论】:

  • 有关信息,您还可以通过将. 包含在字符类[.] 中来转义它的含义,当您有多个文字点时,它往往比\\. 更容易阅读您的正则表达式(即:在\\w[.]\\d{2}[.][^.]+ 中比在\\w\\.\\d{2}\\.[^.]+ 中更容易发现文字点)
  • 我现在将使用[ ] 来处理所有内容,以避免将来出现任何混乱。谢谢。
  • @OliPaul 小心,[abcd] 表示 a、b、c 或 d 中的任何一个(这是一个字符类),而不是 a 后跟 b 等。字符类有其用途。正则表达式很棒,但如果你不想在脚上开枪,你必须了解它们。如本答案和 cmets 所述,请阅读文档 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2012-10-17
  • 1970-01-01
相关资源
最近更新 更多