我正在努力获得一些正则表达式代码才能工作。我有一长串字符串需要部分提取。我只需要以“WER”开头的字符串,我只需要在字母上开始(包括)字符串的最后一部分。
test <- c("abc00012Z345678","WER0004H987654","WER12400G789456","WERF12","0-0Y123")
这是一行代码,但只能用于一个字母。但是在我的字符串列表中,它可以包含任何字母。
ifelse(substr(test,1,3)=="WER",gsub("^.*H.*?","H",test),"")
我希望实现的目标如下:
H987654
G789456
F12
答案 0 :(得分:5)
您可以在gsub
使用以下模式:
> gsub("^(?:WER.*([a-zA-Z]\\d*)|.*)$", "\\1", test)
[1] "" "H987654" "G789456" "F12" ""
请参阅regex demo
此模式匹配:
^
- 字符串的开头(?:
- 开始一个有两个替代方案的轮流组:
WER.*([a-zA-Z]\\d*)
- WER
字符序列后跟0 +任意字符(.*
)尽可能多的字母([a-zA-Z]
)后跟0+位数(\\d*
)(替换为\\d+
以匹配1+位,至少需要1位数字)|
- 或)$
- 关闭替换组并将字符串结尾与$
匹配。来自 stringr 的str_match
,它甚至更整洁:
> library(stringr)
> res <- str_match(test, "^WER.*([a-zA-Z]\\d*)$")
> res[,2]
[1] NA "H987654" "G789456" "F12" NA
>
如果输入中有换行符,请在模式的开头添加(?s)
:res <- str_match(test, "(?s)^WER.*([a-zA-Z]\\d*)$")
。
答案 1 :(得分:3)
如果您不希望空字符串或NA不适用于不以“WER”开头的字符串,您可以尝试以下方法:
if ($result)