2017-03-08 17 views
4

我需要一個正則表達式,它返回一個特定的字母和下一個(一個或兩個)數字,直到下一個字母。 例如,我想提取多少個碳(C)中的R使用正則表達式是公式中正則表達式,返回特定字母后面的數字直到下一個字母

strings <- c("C16H4ClNO2", "CH8O", "F2Ni") 

我需要返回其可以是一個或2個數字和C的數的表達式氯(Cl)後不返回數字。

substr(strings,regexpr("C[0-9]+",strings) + 1, regexpr("[ABDEFGHIJKLMNOPQRSTUVWXYZ]+",strings) -1) 
[1] "16" "C" "" 

,但我想返回的答案是

"16","1","0" 

此外,我想正則表達式自動查找下一個字母和前停下來,而不是有一個最終位置,我指定爲一個字母不是一個C.

+0

是否爲正則表達式的要求?有更簡單的解決方案,但它們的適用性取決於你真正的問題。最簡單的方法是在記事本++中打開文本,打開搜索窗口類型C並單擊計數 - 您可以在那裏設置更多規則,如果真的需要,可以在那裏使用正則表達式;對於軟件類型的應用程序我會使用python,閱讀var中的所有文本,然後在var – Drako

+0

中尋找一些東西對不起 - 可能被誤解的問題 – Drako

+1

你可以檢查regex101.com並在那裏測試,但只是建議而不是整個字母表,你可以使用[AZ ]或[a-zA-Z]如果小寫字母也包括數字是\ d因此C \ d +會找到您需要的所有信息 – Drako

回答

1

如果我理解正確你的問題,你正在尋找兩件事情:

  • C +多項隨即=>比賽這個數字
  • ,接着爲另一大寫字母(另一種化學元素,即)=>計數Ç

如果你能安裝另一個庫,你可能會相處:

library("stringr") 
strings <- c("C16H4ClNO2", "CH8O", "F2Ni") 

str1 <- str_extract(strings, '(?<=C)\\d+') 
str2 <- str_count(strings, 'C[A-Z]') 
str2[!is.na(str1)] = str1[!is.na(str1)] 
str2 
# [1] "16" "1" "0" 

這做了很多花哨的東西,str1尋找第一個條件(C後跟另一個數字),而str2 LO第二種情況。最後一行結合了這兩種載體

0

我們可以做到這一點與base R

sub("C(\\d+).*", "\\1", sub("C([^0-9]+)", 
    "C1\\1", ifelse(!grepl("C", strings), paste0("C0", strings), strings))) 
#[1] "16" "1" "0" 
9

在CHNOSZ包將解析化學式makeup。這裏有一些替代使用它:

1)創建一個列表,例如完全解析公式L,然後爲每一個檢查,如果它有一個"C"組件,並返回其值或0無:

library(CHNOSZ) 

L <- Map(makeup, strings) 
sapply(L, function(x) if ("C" %in% names(x)) x[["C"]] else 0) 
## C16H4ClNO2  CH8O  F2Ni 
##   16   1   0 

注意L是在情況下,完全解析公式列表您有其他要求:

> L 
$C16H4ClNO2 
C H Cl N O 
16 4 1 1 2 

$CH8O 
C H O 
1 8 1 

$F2Ni 
F Ni 
2 1 

1A)通過添加​​到每個列表組件,我們可以避免測試對於碳的產生在sapply線以下較短的版本的存在(1):

sapply(lapply(L, c, c(C = 0)), "[[", "C") 

2)此的一行變動(1)給出與(1)中相同的答案,但名稱除外。其附加"C0"每個式,以避免測試對於碳的存在:

sapply(lapply(paste0(strings, "C0"), makeup), "[[", "C") 
## [1] 16 1 0 

2a)中這裏是的變化(2)通過使用以下事實makeup將接受一個矩陣消除了lapply

sapply(makeup(as.matrix(paste0(strings, "C0"))), "[[", "C") 
## [1] 16 1 0 
0
ifelse(str_extract(strings,'(?<=C)(\\d+|)')=='',1,str_extract(strings,'(?<=C)(\\d+|)')) 
[1] "16" "1" NA 
+0

請不要發佈代碼的答案。你可以通過解釋它的工作原理或爲什麼更好地選擇它來改善你的答案。 –

相關問題