括号括起来

时间:2015-07-08 12:34:49

标签: regex r

假设我有一个像" ABC(123-456-789)"这样的字符串,我想知道什么是最好的检索方式" 123-456- 789"从中。

strsplit("A B C (123-456-789)", "\\(")
[[1]]
[1] "A B C" "123-456-789)"

5 个答案:

答案 0 :(得分:9)

如果我们想要在大括号之间提取-的数字,则一个选项为str_extract。如果字符串中有多个模式,请使用str_extract_all

 library(stringr)
 str_extract(str1, '(?<=\\()[0-9-]+(?=\\))')
 #[1] "123-456-789"
 str_extract_all(str2, '(?<=\\()[0-9-]+(?=\\))')

在上面的代码中,我们使用正则表达式的外观来提取数字和-。积极的外观(?<=\\()[0-9-]+-中的[0-9-]+(123-456-789)以及123-456-789中的数字相匹配。类似地,前瞻('[0-9 - ] +(?= \)')与-中的123-456-789)123-456-798中的(123-456-789)匹配。总之,它匹配满足条件(123-456-789的所有情况,并在外观之间提取,而不是像123-456-789)strsplit

这样的情况

使用split,您可以将[()]指定为()。我们将方括号内的[]保留为'\\(|\\)'以将其视为字符,否则我们必须转义括号( strsplit(str1, '[()]')[[1]][2] #[1] "123-456-789" )。

lapply

如果要从字符串中提取多个子字符串,我们可以使用grep循环并使用 lapply(strsplit(str2, '[()]'), function(x) grep('\\d', x, value=TRUE))

提取数字拆分部分
stri_split

或者我们可以使用stringi中的omit_empty=TRUE library(stringi) stri_split_regex(str1, '[()A-Z ]', omit_empty=TRUE)[[1]] #[1] "123-456-789" stri_split_regex(str2, '[()A-Z ]', omit_empty=TRUE) 可以选择删除空字符串(rm_round)。

qdapRegex

如果我们有兴趣提取括号内的内容,则另一个选项是来自 library(qdapRegex) rm_round(str1, extract=TRUE)[[1]] #[1] "123-456-789" rm_round(str2, extract=TRUE) 的{​​{1}}。

 str1 <-  "A B C (123-456-789)"
 str2 <- c("A B C (123-425-478) A", "ABC(123-423-428)",
 "(123-423-498) ABCDD", 
  "(123-432-423)", "ABC (123-423-389) GR (124-233-848) AK")

数据

int i1 = 5;
int i2 = 0;
int result = i1 * 10 + i2; /* 50 */

答案 1 :(得分:8)

或来自sub的{​​{1}}:

base R

说明:

sub("[^(]+\\(([^)]+)\\).*", "\\1", "A B C (123-456-789)") #[1] "123-456-789" :匹配除开始支架以外的任何内容 [^(]+:匹配一个开头括号,就在你想要的之前 \\(:匹配您要捕获的模式(然后在([^)]+)中检索),这是除了关闭支架之外的任何内容 replacement="\\1"匹配一个结束括号后跟任何内容,0次或更多次

另一种具有前瞻和后瞻的选项

\\).*

答案 2 :(得分:5)

sub中的捕获组将定位您想要的输出:

sub('.*\\((.*)\\).*', '\\1', str1)
[1] "123-456-789"

额外检查以确保我通过@ akrun的扩展示例:

sub('.*\\((.*)\\).*', '\\1', str2)
[1] "123-425-478" "123-423-428" "123-423-498" "123-432-423" "124-233-848"

答案 3 :(得分:4)

也可以尝试:

 k<-"A B C (123-456-789)"
     regmatches(k,gregexpr("*.(\\d+).*",k))[[1]]
[1] "(123-456-789)"

来自@Arun的建议:

regmatches(k, gregexpr('(?<=\\()[^A-Z ]+(?=\\))', k, perl=TRUE))[[1]]

来自@akrun的建议:

regmatches(k, gregexpr('[0-9-]+', k))[[1]]

答案 4 :(得分:4)

您可以尝试这些gsub功能。

> gsub("[^\\d-]", "", x, perl=T)
[1] "123-456-789"
> gsub(".*\\(|\\)", "", x)
[1] "123-456-789"
> gsub("[^0-9-]", "", x)
[1] "123-456-789"

少数......

> gsub("[0-9-](*SKIP)(*F)|.", "", x, perl=T)
[1] "123-456-789"
> gsub("(?:(?![0-9-]).)*", "", x, perl=T)
[1] "123-456-789"