【问题标题】:Separate numbers from text in R将数字与R中的文本分开
【发布时间】:2015-03-24 16:57:43
【问题描述】:

我有一些文字:

text="blablabla 400ft blablabla"

我想得到:

"blablabla 400 ft blablabla"

命令:

unlist(strsplit(text,split="[^0-9]+"))
gsub("[^0-9]+", " ", text, fixed = FALSE)

只返回 400。

我想对 gsub 说:将您在文本中找到的每个数字替换为相同的数字加上开头和结尾的空格。我该怎么做?

【问题讨论】:

  • 根据您的描述,您正在寻找gsub("([0-9]+)", " \\1 ", text),尽管它总是会在前后添加一个空格,即使不需要。
  • 没错,对于已经从文本中分离出来的数字。以后我总是可以去掉多余的空白。

标签: regex r text gsub grepl


【解决方案1】:

如果在某些情况下您想将数字与“ft”分开,您也可以使用环视,而不是其他情况:

text="blablabla 400ft blablabla 400notft"

gsub('(?<=\\d)(?=ft)', ' ', text, perl = TRUE)

# [1] "blablabla 400 ft blablabla 400notft"

相对于gsub('([0-9]+)([^0-9]+)', '\\1 \\2', text),无论接下来发生什么都会分开:

gsub('([0-9]+)([^0-9]+)', '\\1 \\2', text)

# [1] "blablabla 400 ft blablabla 400 notft"

你也可以使用其他条件:

text="blablabla 400ft blablabla 400notft blablabla 400in"

gsub('(?<=\\d)(?=ft|in)', ' ', text, perl = TRUE)
# [1] "blablabla 400 ft blablabla 400notft blablabla 400 in"

或者说您需要在字母和数字之间添加空格,同时保留上述规则:

text2 <- 'blblabla 400ft blablaba400ft 400 blabla 400notft blah400notft'
gsub('(?<=[A-Za-z])(?=\\d+)|(?<=\\d)(?=ft|in)', ' ', text2, perl = TRUE)

# [1] "blblabla 400 ft blablaba 400 ft 400 blabla 400notft blah 400notft"

【讨论】:

  • 我觉得你说的有道理,但我不确定这是否只针对ft
  • @akrun 我添加了英尺和英寸。我认为这涵盖了所有内容,是的:}
  • [1] "blblabla 400 ft blablaba400 ft 400 blabla"中间400之前应该有空格吗?
  • 无论如何,没关系,OP没有正确描述它。
  • text2 &lt;- 'blblabla 400ft blablaba400ft 400 blabla 400notft'; gsub('(?&lt;=[A-Za-z])(?=\\d+?)|(?&lt;=\\d)(?=ft|in)', ' ', text2, perl = TRUE) 我对正则表达式的了解已接近尾声
【解决方案2】:

试试

 gsub('([0-9]+)([^0-9]+)', '\\1 \\2', text)
 #[1] "blablabla 400 ft blablabla"

也适用于多个实例

 text1 <- paste(text, text)
 gsub('([0-9]+)([^0-9]+)', '\\1 \\2', text1)
 #[1] "blablabla 400 ft blablabla blablabla 400 ft blablabla"

【讨论】:

  • 我认为您可以将其简化为 gsub('(\\d+)(\\D+)', '\\1 \\2', text1)
  • @user2835597 我没有尝试whitespace at the beginning,因为它会创建额外的空间
  • @DavidArenburg 感谢 cmets。我现在实际上正在考虑 OP 的 cmets 中的描述,因为我以前没有注意到它。
  • 是的,我已经在问题下发表了评论。我认为OP很困惑。更不用说他说你的解决方案完美无缺。
  • 我是 gsub 和正则表达式的初学者,对不起。我说 akrun 提出的初始解决方案效果很好,因为我执行了命令,它给了我想要的东西。
【解决方案3】:

我想对 gsub 说:将您在文本中找到的每个数字替换为 相同的数字加上开头和结尾的空格

gsub("([0-9]+)", " \\1 ", text)

【讨论】:

    猜你喜欢
    • 2021-06-13
    • 2022-07-15
    • 1970-01-01
    • 2017-04-26
    • 2018-10-18
    • 2019-10-03
    • 1970-01-01
    • 2023-04-01
    • 2018-08-24
    相关资源
    最近更新 更多