regex 如何提取两个数字之间的字符?

jgwigjjp  于 2023-04-22  发布在  其他
关注(0)|答案(5)|浏览(106)

我有一个字符串,我想提取两个数字之间的所有字符(所有字符在开始和结束时没有scpaces)。事实上,情况有点棘手,因为有时字符串中有数字,有时没有。让字符串是:

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(在这里可能更容易..)。希望有正则表达式大师可以帮助我!

vsmadaxz

vsmadaxz1#

拆分空格、数字和空格,然后删除空字符串并取第一个组件(如果没有,则为NA)。

sapply(strsplit(my_string, " *\\d+ *"), function(x) x[x != ""][1])
## [1] "aöc-ABC" "XY/zz"   "acs"     "as c"    "f~ds"    NA
5hcedyr0

5hcedyr02#

以下是stringr选项

library(stringr)

str_match(my_string, "\\d?\\s?(\\D+)\\s?\\d?")[,2] |>
  dplyr::na_if(" ")
sigwle7e

sigwle7e3#

一种方法可能是用两个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
mwyxok5s

mwyxok5s4#

以下是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>
wbgh16ku

wbgh16ku5#

正如@GregorThomas在评论中指出的那样,我非常接近解决方案!因此,为了完整起见,这里更正了我的问题的代码

gsub("^\\d*\\s*([^[:digit:]]+)\\d*.*", "\\1", my_string)

与所讨论的代码的唯一区别是加号在组内,而不是在组外。

相关问题