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

问题描述 投票:0回答:6

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

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

r regex
6个回答
2
投票

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

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

1
投票

这里有一个

stringr
选项

library(stringr)

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

1
投票

一种方法可能是用两个

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 

1
投票

这是一个

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>

0
投票

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

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

与相关代码的唯一区别是加号在组内,而不是在组外。


0
投票

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))

O/P :- ('aöc-ABC a', 'XY/zzab', 'acs', 'as c', 'f~ds d', '')

© www.soinside.com 2019 - 2024. All rights reserved.