我试图找到一种简单的方法来提取出现在两个已知子串之间的未知子串(可能是任何东西).例如,我有一个字符串:
a<-" anything goes here, STR1 GET_ME STR2, anything goes here"
我需要提取GET_ME
STR1和STR2之间的字符串(没有空格).
我正在尝试str_extract(a, "STR1 (.+) STR2")
,但我得到了整场比赛
[1] "STR1 GET_ME STR2"
Run Code Online (Sandbox Code Playgroud)
我当然可以删除已知的字符串,以隔离我需要的子字符串,但我认为应该有一个更清晰的方法来使用正确的正则表达式.
我想要完成的是将列拆分为多个列.我希望第一列包含"F",第二列"US",第三列"CA6"或"DL",第四列是"Z13"或"U13"等等.我的整个df遵循相同的模式X.XX.XXXX.XXX或X.XX.XXX.XXX或X.XX.XX.XXX我知道第三列是我的问题所在,因为长度不同.我过去只使用了substr,我可以在这里使用一些if语句,但是想学习如何使用stringr包和POSIX来做到这一点(除非有更好的选择).先感谢您.
这是我的df:
c("F.US.CLE.V13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13",
"F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13",
"F.US.DL.U13", "F.US.DL.U13", "F.US.DL.U13", "F.US.DL.Z13", "F.US.DL.Z13"
)
Run Code Online (Sandbox Code Playgroud) 我试图取代两个"st." 和"ste." 用"st".似乎以下应该可以工作,但它不会:
require("stringr")
county <- c("st. landry", "ste. geneveve", "st. louis")
str_replace_all(county, c("st\\.", "ste\\."), "st")
Run Code Online (Sandbox Code Playgroud) 我很确定我在这里遗漏了一些明显的东西,但是我不能让R使用非贪婪的正则表达式:
> library(stringr)
> str_match('xxx aaaab yyy', "a.*?b")
[,1]
[1,] "aaaab"
Run Code Online (Sandbox Code Playgroud)
基本函数的行为方式相同:
> regexpr('a.*?b', 'xxx aaaab yyy')
[1] 5
attr(,"match.length")
[1] 5
attr(,"useBytes")
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
我希望这场比赛符合http://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html中的ab
'贪婪'评论:
默认情况下,重复是贪婪的,因此使用最大可能的重复次数.这可以通过附加改为'minimal'吗?到量词.(还有其他量词允许近似匹配:请参阅TRE文档.)
有人可以解释一下发生了什么事吗?
更新.令人抓狂的是,在其他一些情况下,非贪婪模式的行为符合预期:
> str_match('xxx <a href="abc">link</a> yyy <h1>Header</h1>', '<a.*>')
[,1]
[1,] "<a href=\"abc\">link</a> yyy <h1>Header</h1>"
> str_match('xxx <a href="abc">link</a> yyy <h1>Header</h1>', '<a.*?>')
[,1]
[1,] "<a href=\"abc\">"
Run Code Online (Sandbox Code Playgroud) 我在R工作,遇到麻烦逃避反斜杠.我正在使用图书馆stringr
.
install.packages("stringr", repos='http://cran.us.r-project.org')
library("stringr")
Run Code Online (Sandbox Code Playgroud)
我想要做 str = str_replace_all(str, "\", "")
所以我试过str = str_replace_all(str, "\\", "")
但它不起作用.
我该怎么办?
我想加入两个数据帧,如果seed
在数据帧列y
是对部分匹配string
列x
.这个例子应该说明:
# What I have
x <- data.frame(idX=1:3, string=c("Motorcycle", "TractorTrailer", "Sailboat"))
y <- data_frame(idY=letters[1:3], seed=c("ractor", "otorcy", "irplan"))
x
idX string
1 1 Motorcycle
2 2 TractorTrailer
3 3 Sailboat
y
Source: local data frame [3 x 2]
idY seed
(chr) (chr)
1 a ractor
2 b otorcy
3 c irplan
# What I want
want <- data.frame(idX=c(1,2), idY=c("b", "a"), string=c("Motorcycle", "TractorTrailer"), seed=c("otorcy", "ractor"))
want
idX idY string seed
1 1 b Motorcycle …
Run Code Online (Sandbox Code Playgroud) 我有以下字符串:
strings <- c("ABBSDGNHNGA", "AABSDGDRY", "AGNAFG", "GGGDSRTYHG")
Run Code Online (Sandbox Code Playgroud)
我想切断字符串,一旦A,G和N的出现次数达到一定值,比如说3.在这种情况下,结果应该是:
some_function(strings)
c("ABBSDGN", "AABSDG", "AGN", "GGG")
Run Code Online (Sandbox Code Playgroud)
我试图用stringi
,stringr
和正则表达式的表达式,但我无法弄清楚.
stringr包提供了良好的字符串函数.
搜索字符串(忽略大小写)
一个人可以用
stringr::str_detect('TOYOTA subaru',ignore.case('toyota'))
Run Code Online (Sandbox Code Playgroud)
这有效,但会发出警告
请使用(fixed | coll | regex)(x,ignore_case = TRUE)而不是ignore.case(x)
重写它的正确方法是什么?
如何检测字符串中的所有字母字符(> = 2个字符)是否为大写?最后,我试图过滤掉章节标题名称,即我的数据集中的行.因此,如果章节标题是"ARYA",我希望检测到,与"女王的手"相同.
这是我正在尝试但不起作用的:
library(dplyr)
library(stringr)
str_detect("THE QUEEN’S HAND", "^[[:upper:]]{2,}+$")
#> FALSE
Run Code Online (Sandbox Code Playgroud)
我需要的要求:
toupper(x) == (x)
解决方案,这将与"女王的手"一样被检测到.我也试图摆脱任何带有感叹号或句号的东西,比如"停止这个!"假设我有这样的文字,
text<-c("[McCain]: We need tax policies that respect the wage earners and job creators. [Obama]: It's harder to save. It's harder to retire. [McCain]: The biggest problem with American healthcare system is that it costs too much. [Obama]: We will have a healthcare system, not a disease-care system. We have the chance to solve problems that we've been talking about... [Text on screen]: Senators McCain and Obama are talking about your healthcare and financial security. We need more than talk. …
Run Code Online (Sandbox Code Playgroud)