我完全坚持使用R中的正则表达式。我使用www.regex101.com来检查我的正则表达式,它似乎有效。但在R中却没有。
我已经读到不同口味之间存在细微差别,但我不知道这些差异在哪里或者需要注意什么。有没有办法使用lookahead
等更高级的regtex工作在像grep(), sub(), gregexpr()
这样的R函数中?
这是我的字符串:
x <- "n\n\nwelcome\nstar\n\n\n\n\nhowdy\nstar\n\n\n\n\nhi\nstar\n\n\n\n\ngreetings\nstar"
这是我的正则表达式:
"/(?<=\\n)((?:(?!\\n).)*?)(?=\\nstar)/g"
这是我在R中尝试的:
x <- grep("(?<=\\n)((?:(?!\\n).)*?)(?=\\nstar)",x,perl=TRUE,value=TRUE)
OR
x <- grep("/(?<=\\n)((?:(?!\\n).)*?)(?=\\nstar)/g",x,perl=TRUE,value=TRUE)
这是我想要的输出:
"welome" "howdy" "hi" "greetings"
谢谢!
答案 0 :(得分:1)
你似乎不必要地逃避R中的新行(\n
),因为你的x只是R中长度为1的向量,grep()
将匹配该元素或者它赢了&# 39;吨。它不会在该字符值中提取匹配项。为此,您需要使用gregexpr()
函数。这个怎么样
x <-"\n\n\nwelcome\nstar\n\n\n\n\nhowdy\nstar\n\n\n\n\nhi\nstar\n\n\n\n\ngreetings\nstar"
regmatches(x, gregexpr("(?<=\n)((?:(?!\n).)*?)(?=\nstar)",x,perl=TRUE))
# [[1]]
# [1] "welcome" "howdy" "hi" "greetings"
答案 1 :(得分:0)
或者只是简单的strsplit
。这会在字符串的开头(可能是拼写错误)或\n
基于n
,star
拆分字符串。
nzchar
为空字符串返回逻辑TRUE
,否则返回FALSE
,Filter
过滤掉TRUE
s
x <- "n\n\nwelcome\nstar\n\n\n\n\nhowdy\nstar\n\n\n\n\nhi\nstar\n\n\n\n\ngreetings\nstar"
Filter(nzchar, strsplit(x, '\n|^n|star')[[1]])
# [1] "welcome" "howdy" "hi" "greetings"