0

R から完全な RegEx マッチを取得しようとしていますが、文字列の最初の部分しか取得できないようです。

http://regexpal.com/を使用すると、RegEx が適切であり、期待どおりであることを確認できます。私のデータでは、「エラーの種類」は、アスタリスクで始まる数字と次のコンマの間にあります。だから私は"*20508436572 access forbidden by rule"最初のインスタンスと"*20508436572 some_error"2 番目のインスタンスに戻ることを探しています。

例:

library(stringr)

regex.errortype<-'\\*\\d+\\s[^,\\n]+'
test_string1<-'2014/08/07 08:28:56 [error] 21278#0: *20508436572 access forbidden by rule, client: 111.222.111.222'
test_string2<-'2014/08/07 08:28:56 [error] 21278#0: *20508436572 some_error, client: 111.222.111.222'

str_extract(test_string1, regex.errortype)
str_extract_all(test_string1, regex.errortype)
regmatches(test_string, regexpr(regex.errortype, test_string1))

str_extract(test_string2, regex.errortype)
str_extract_all(test_string2, regex.errortype)
regmatches(test_string2, regexpr(regex.errortype, test_string2))

結果:

> str_extract(test_string1, regex.errortype)
[1] "*20508436572 access forbidde"
> str_extract_all(test_string1, regex.errortype)
[[1]]
[1] "*20508436572 access forbidde"

> regmatches(test_string1, regexpr(regex.errortype, test_string1))
[1] "*20508436572 access forbidde"

> str_extract(test_string2, regex.errortype)
[1] "*20508436572 some_error"
> str_extract_all(test_string2, regex.errortype)
[[1]]
[1] "*20508436572 some_error"

> regmatches(test_string2, regexpr(regex.errortype, test_string2))
[1] "*20508436572 some_error"

ご覧のとおり、長い一致は切り詰められていますが、短い一致は正しく解析されています。

ここで何か不足していますか、それとも完全な一致を取り戻すための他の方法はありますか?

乾杯、

アンディ。

4

2 に答える 2

2
 str_extract_all(test_string1, perl("(?<=\\#[0-9]\\: )\\*\\d+\\s[^,\\n]+"))[[1]]
#[1] "*20508436572 access forbidden by rule"

str_extract_all(test_string2, perl("(?<=\\#[0-9]\\: )\\*\\d+\\s[^,\\n]+"))[[1]]
#[1] "*20508436572 some_error"

後読みの使用

(?<=\\#探す#

[0-9] 数字が続く

\\::とスペース が続く

次に、あなたのパターンを使用しました

于 2014-08-08T10:34:15.743 に答える
0

gsub正規表現を書き直すことなく、両方のケースで目的の文字列を削除する方法を次に示します。

> gsub("((.*)[*])|([,](.*))", "", c(test_string1, test_string2))
# [1] "20508436572 access forbidden by rule" 
# [2] "20508436572 some_error"   

正規表現((.*)[*])|([,](.*))では、

  • ((.*)[*])キャラクターまですべてを削除します*
  • |「または」を意味します
  • ([,](.*))コンマとその後のすべてを削除します。
于 2014-08-08T10:49:14.503 に答える