使用正则表达式提取字符串的一部分

时间:2016-03-16 11:02:58

标签: regex r string

我正在努力获得一些正则表达式代码才能工作。我有一长串字符串需要部分提取。我只需要以“WER”开头的字符串,我只需要在字母上开始(包括)字符串的最后一部分。

test <- c("abc00012Z345678","WER0004H987654","WER12400G789456","WERF12","0-0Y123")

这是一行代码,但只能用于一个字母。但是在我的字符串列表中,它可以包含任何字母。

ifelse(substr(test,1,3)=="WER",gsub("^.*H.*?","H",test),"")

我希望实现的目标如下:

H987654
G789456
F12

2 个答案:

答案 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位数字)
    • | - 或
    • `。* - 任意0+个字符
  • )$ - 关闭替换组并将字符串结尾与$匹配。

来自 stringr str_match,它甚至更整洁:

> library(stringr)
> res <- str_match(test, "^WER.*([a-zA-Z]\\d*)$")
> res[,2]
[1] NA        "H987654" "G789456" "F12"     NA       
> 

请参阅another regex demo

如果输入中有换行符,请在模式的开头添加(?s)res <- str_match(test, "(?s)^WER.*([a-zA-Z]\\d*)$")

答案 1 :(得分:3)

如果您不希望空字符串或NA不适用于不以“WER”开头的字符串,您可以尝试以下方法:

if ($result)