1

ライブラリを使用して、Rクランで正規表現を使用しようとしていますstringr。関数str_matchと勉強していました。str_replaceGrouping に括弧を使用すると、異なる結果が得られる理由がわかりません。

library(stringr)
s<-"(.+?)( PIAZZALE | SS)(.+?)([0-9]{5})"

a<-str_match("MONT SS DPR   PIAZZALE CADORNA, 1A RICCIONE   47838",perl(s))
b<-str_replace("MONT SS DPR   PIAZZALE CADORNA, 1A RICCIONE   47838",perl(s), "\\2")

a[3]
#[1] " PIAZZALE "
b
#[1] " SS"
4

1 に答える 1

1

sの代わりに式だけを使用してみてくださいperl(s):

library(stringr)
s<-"(.+?)( PIAZZALE | SS)(.+?)([0-9]{5})"

a<-str_match("MONT SS DPR   PIAZZALE CADORNA, 1A RICCIONE   47838",s)
b<-str_replace("MONT SS DPR   PIAZZALE CADORNA, 1A RICCIONE   47838",s, "\\2")

a[3]
#[1] " PIAZZALE "
b
#[1] " PIAZZALE "

このライブラリのドキュメントを見てきました: http://cran.r-project.org/web/packages/stringr/stringr.pdf

str_replaceメソッドはデフォルトで POSIX パターンを受け入れ、提供されている場合は perl パターンも受け入れることができますが、str_matchは POSIX スタイルのパターンのみを受け入れることができ、perl パターンが提供されている場合はパターンをそのように扱うことを示唆しています。それらが異なる値を提供していた理由は、異なる式エンジンを使用していたためです。str_detectは perl 式を使用でき、TRUEEまたはを返しますFALSEstr_detectmatch メソッドの代わりにこのメソッドを潜在的に使用できますか?


これを引き起こすPOSIXとperlの違い:

POSIX エンジンは、怠惰な (貪欲ではない) 量指定子を認識しません。

あなたの表現

(.+?)( PIAZZALE | SS)(.+?)([0-9]{5}) 

の perl に相当するものと見なされます

(.+)( PIAZZALE | SS)(.+)([0-9]{5})

バックトラックして残りの式を評価する前に、最初の量化されたクラス.+が可能な限り (完全な文字列) 一致する場所。最初の数量化されたクラスが文字列の末尾から完全に戻ってきて、2 番目のキャプチャ グループだけに残る .+文字を消費すると成功です。MONT SS DPR SSa[3]

エンジン内部の仕組みの簡単な説明

以下は、さまざまなエンジンが文字列を処理する方法を簡単に説明したものです。すべての量指定子/代替はキャプチャ グループに直接ラップされるため、次の例の番号付きの量指定子もキャプチャ グループになります。

パール:

Quantifier 1: "M"
Quantifier 2: FAILED - MUST BACKTRACK

Quantifier 1: "MO"
Quantifier 2: FAILED - MUST BACKTRACK

Quantifier 1: "MON"
Quantifier 2: FAILED - MUST BACKTRACK

Quantifier 1: "MONT"
Quantifier 2: " SS"
Quantifier 3: " "
Quantifier 4: FAILED - MUST BACKTRACK

Quantifier 1: "MONT"
Quantifier 2: " SS"
Quantifier 3: " D"
Quantifier 4: FAILED - MUST BACKTRACK

...

Quantifier 1: "MONT"
Quantifier 2: " SS"
Quantifier 3: " DPR   PIAZZALE CADORNA, 1A RICCIONE   "
Quantifier 4: "47838"

SUCCESS

POSIX:

Quantifier 1: "MONT SS DPR   PIAZZALE CADORNA, 1A RICCIONE   47838"
Quantifier 2: FAILED - MUST BACKTRACK

Quantifier 1: "MONT SS DPR   PIAZZALE CADORNA, 1A RICCIONE   4783"
Quantifier 2: FAILED - MUST BACKTRACK

Quantifier 1: "MONT SS DPR   PIAZZALE CADORNA, 1A RICCIONE   478"
Quantifier 2: FAILED - MUST BACKTRACK

Quantifier 1: "MONT SS DPR   PIAZZALE CADORNA, 1A RICCIONE   47"
Quantifier 2: FAILED - MUST BACKTRACK

...

Quantifier 1: "MONT SS DPR   P"
Quantifier 2: FAILED - MUST BACKTRACK

Quantifier 1: "MONT SS DPR   "
Quantifier 2: FAILED - MUST BACKTRACK

Quantifier 1: "MONT SS DPR  "
Quantifier 2: " PIZZALE "
Quantifier 3: "CADORNA, 1A RICCIONE   47838"
Quantifier 4: FAILED - MUST BACKTRACK

...

Quantifier 1: "MONT SS DPR  "
Quantifier 2: " PIZZALE "
Quantifier 3: "CADORNA, 1A RICCIONE   "
Quantifier 4: "47838"

SUCCESS
于 2015-02-24T12:24:04.893 に答える