【问题标题】:How do I extract text between two characters in R如何在R中的两个字符之间提取文本
【发布时间】:2023-04-08 19:08:01
【问题描述】:

我想为所有出现的模式提取两个字符串之间的文本。例如,我有这个字符串:

x<- "\nTYPE:    School\nCITY:   ATLANTA\n\n\nCITY:   LAS VEGAS\n\n" 

我想提取 ATLANTALAS VEGAS 这样的词:

[1] "ATLANTA"   "LAS VEGAS"

我尝试使用gsub(".*CITY:\\s|\n","",x)。这产生的输出是:

[1] "  LAS VEGAS"

我想同时输出两个城市(数据中的某些模式包括超过 2 个城市)并在没有前导空格的情况下输出它们。
我也尝试了 qdapRegex 包,但无法接近。我不太擅长正则表达式,因此非常感谢您的帮助。

【问题讨论】:

  • unlist(stringr::str_extract_all(x,"[A-Z]+(?=\\n)"))

标签: r regex string


【解决方案1】:

另一种选择:

library(stringr)
str_extract_all(x, "(?<=CITY:\\s{3}).+(?=\\n)")
[[1]]
[1] "ATLANTA"   "LAS VEGAS"

读作:提取任何以“City:”(和三个空格)开头并后跟“\n”的内容

【讨论】:

  • 默认情况下,ICU 正则表达式中的 .\n 不匹配。你可以删除(?=\\n)
  • 谢谢,我不知道。每当我做“两个字符之间”时,我总是使用它,所以这是一种习惯。
  • 但是在这种情况下,你有一个贪婪的点。如果你使用懒惰的,那么确定你需要一个正确的边界,"(?&lt;=CITY:\\s{3}).+?(?=\\n)"
【解决方案2】:

你可以使用

> unlist(regmatches(x, gregexpr("CITY:\\s*\\K.*", x, perl=TRUE)))
[1] "ATLANTA"   "LAS VEGAS"

这里,CITY:\s*\K.* 正则表达式匹配

  • CITY: - 文字子字符串 CITY:
  • \s* - 0+ 个空格
  • \K - match reset operator 丢弃目前匹配的文本(将当前匹配内存缓冲区归零)
  • .* - 除换行符之外的任何 0+ 个字符,尽可能多。

请参阅regex demo online

注意,由于它是 PCRE 正则表达式,perl=TRUE 是必不可少的。

【讨论】:

  • 什么是重置运算符?
  • @WiktorStribiżew 你做得这么快而且效果很好!谢谢!
  • @WiktorStribiżew 你能建议一些方法来更好地解决正则表达式问题吗?
  • @YOLO 唯一的办法就是通过不断的练习。按照正则表达式标签,研究答案,当你有东西要添加时尝试回答,并参考像 rexegg.com/regular-expressions.info/regex101.com 这样的网站。
【解决方案3】:

一个选项可以是:

regmatches(x,gregexpr("(?<=CITY:).*(?=\n\n)",x,perl = TRUE))

# [[1]]
# [1] "   ATLANTA"   "   LAS VEGAS"

【讨论】:

    猜你喜欢
    • 2018-11-02
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2020-01-29
    • 2023-03-25
    • 2016-08-13
    相关资源
    最近更新 更多