我有一个字符串,我想在其中提取两个数字之间的所有字符(所有字符在开始和结束时都没有空格)。事实上,情况有点棘手,因为有时字符串中有数字,有时没有。让字符串为:
my_string <- c("12 aöc-ABC 3 a", "43XY/zz23ab", "acs", "23 as c", "f~ds22 d", "1 3")
在这种情况下,我的预期输出是
expected_string <- c("aöc-ABC", "XY/zz", "acs", "as c", "f~ds", NA)
如您所见,有时相关部分前后都有数字(第 1 和第 2 个条目),有时根本没有数字(第 3 个条目),只有在有趣部分之前或之后的数字(第 4 和第 5 个条目)或只是数字,没有我感兴趣的部分(最后一个条目)。
我试过了
gsub("^\\d*\\s*([^[:digit:]])+\\d*.*", "\\1", my_string)
但是我没有得到想要的输出,也不知道为什么。我真的很想使用 gsub() 来更好地理解正则表达式。这意味着我想避免使用 strsplit(在这里可能更容易......)。希望有正则表达式大师可以帮助我解决这个问题!
拆分空格、数字和空格,然后删除空字符串并取第一个组件(如果没有则为 NA)。
sapply(strsplit(my_string, " *\\d+ *"), function(x) x[x != ""][1])
## [1] "aöc-ABC" "XY/zz" "acs" "as c" "f~ds" NA
这里有一个
stringr
选项
library(stringr)
str_match(my_string, "\\d?\\s?(\\D+)\\s?\\d?")[,2] |>
dplyr::na_if(" ")
一种方法可能是用两个
sub
删除表格开始和结束。如果需要replace
""
之后有NA
。
s <- sub(" *\\d+.*$", "", sub("^\\d+ *", "", my_string))
s
#[1] "aöc-ABC" "XY/zz" "acs" "as c" "f~ds" ""
replace(s, s == "", NA)
#[1] "aöc-ABC" "XY/zz" "acs" "as c" "f~ds" NA
这是一个
tidyverse
解决方案:
data.frame(my_string) %>%
# mutate `my_string` *if* the values contain a digit...
mutate(my_string = ifelse(str_detect(my_string, "\\d"),
# ...by extracting either anything that is *not* a digit...
# ...if wrapped into digits OR without that condition:
trimws(str_extract(my_string, "(?<=\\d{1,10})\\D+(?=\\d+)|\\D+")),
# else use values as are:
my_string),
# convert empty values to `NA`:
my_string = na_if(my_string, "")
)
my_string
1 aöc-ABC
2 XY/zz
3 acs
4 as c
5 f~ds
6 <NA>
正如@GregorThomas 在评论中指出的那样,我非常接近解决方案!所以为了完整起见,我的问题中更正的代码
gsub("^\\d*\\s*([^[:digit:]]+)\\d*.*", "\\1", my_string)
与相关代码的唯一区别是加号在组内,而不是在组外。
L = ("12 aöc-ABC 3 a", "43XY/zz23ab", "acs", "23 as c", "f~ds22 d", "1 3") T=[] 对于 L 中的 i: S = 列表(i) L1="" 对于 S 中的我: 如果“0”<= i <="9": pass else: L1+=i T.append(L1.strip()) print(tuple(T))