4

文字列のベクトルがあります:

s <- c('abc1',   'abc2',   'abc3',   'abc11',   'abc12', 
       'abcde1', 'abcde2', 'abcde3', 'abcde11', 'abcde12', 
       'nonsense')

正規表現を、、、、またはで始まる文字列とabcで終わる文字列のみに一致させたいのですが。つまり、正規表現は除外する必要がありますが、除外する必要はありませんが、などは除外する必要があります。31112abc1abc11abc2abc12

これは先読みアサーションで簡単にできると思いましたが、方法が見つかりませんでした。ありますか?


編集:元の投稿の深刻なあいまいさを指摘してくれた以下のポスターに感謝します。

実際、私はたくさんの弦を持っています。それらはすべて数字で終わります。0の数字、9の数字、その間の数字の数字です。文字の後に1または2が続く文字列を除くすべての文字列に一致する正規表現を探しています(正規表現は、で始まる文字列のみに一致する必要がありますがabc、これは簡単な問題です)。

このような正規表現を作成するために、否定的な先読みアサーションを使用しようとしました。しかし、私は成功しませんでした。


返信してコメントしてくれたすべての人に感謝します。あなたの何人かに触発されて、私はこの組み合わせを使うことになりました:grepl('^abc', s) & !grepl('[[:lower:]][12]$', s)

4

4 に答える 4

4

1つの複雑な正規表現の代わりに、この場合、2つの単純な正規表現を使用する方が簡単だと思います。

s <- c('abc1',   'abc2',   'abc3',   'abc11',   'abc12', 
       'abcde1', 'abcde2', 'abcde3', 'abcde11', 'abcde12', 
       'nonsense')

s[grepl("^abc", s) & grepl("(3|11|12)$", s)]
于 2012-11-21T22:34:13.050 に答える
3

これは、あなたの望むことですか?

s[grepl("abc.*(3|11|12)", s)]
[1] "abc3"    "abc11"   "abc12"   "abcde3"  "abcde11" "abcde12"

除外される文字列は次のとおりです。

s[!grepl("abc.*(3|11|12)", s)]
[1] "abc1"     "abc2"     "abcde1"   "abcde2"   "nonsense"

編集:コメントが示すように、要件にはあいまいさがあります。より包括的な正規表現は、文字列の開始^と終了をテストし、場合によっては最後の数字の前に$アルファベット文字のみを許可します。[[:alpha:]]

s[grepl("^abc[[:alpha:]]*.*(3|11|12)$", s)]
[1] "abc3"    "abc11"   "abc12"   "abcde3"  "abcde11" "abcde12"

grep引数を渡すことで値を直接返すこともできるためvalue=TRUE、コードの重複を少し節約できます。

grep("^abc[[:alpha:]]*.*(3|11|12)$", s, value=TRUE)
[1] "abc3"    "abc11"   "abc12"   "abcde3"  "abcde11" "abcde12"
于 2012-11-21T22:14:00.523 に答える
1

substringこの場合も使用できます:

z <- nchar(s)
s[substring(s, 1, 3) == "abc" & substring(s, z) == "3" | 
    substring(s, z-1) %in%  c("12", "11")] 
于 2012-11-21T22:18:38.293 に答える
0

要求された番号を具体的に探すと、次のようになります。

n <-  c(3,11,12)

s[sub('abc[^[:digit:]]*([[:digit:]]+)$',s, replacement='\\1') %in% n]
 [1] "abc3"    "abc11"   "abc12"   "abcde3"  "abcde11" "abcde12"

これは11と1を混同しません。

 n <-  c(3,1,12)

s[sub('abc[^[:digit:]]*([[:digit:]]+)$',s, replacement='\\1') %in% n]
 [1] "abc1"    "abc3"    "abc12"   "abcde1"  "abcde3"  "abcde12"

編集の場合、1または2で終わらない(そして2つの正規表現を使用する)

s[grepl('^abc',s) & !(sub('.*[^[:digit:]]([[:digit:]]+)$',s, replacement='\\1') %in% c(1,2))]
[1] "abc3"    "abc11"   "abc12"   "abcde3"  "abcde11" "abcde12"
于 2012-11-21T22:39:15.740 に答える