2016-09-06 5 views
2

正規表現を使用して文字列からサブ文字列を抽出しようとしています。以下Python(与え所望の結果)の作動コードTCLでPerlとPythonとで動作が異なる正規表現パターン

Pythonの溶液である

x = r'CAR_2_ABC_547_d' 
>>> spattern = re.compile("CAR_.*?_(.*)") 
>>> spattern.search(x).group(1) 
'ABC_547_d' 
>>> 

Perlのソリューション

$ echo "CAR_2_ABC_547_d" | perl -pe's/CAR_.*?_(.*)/$1/' 
ABC_547_d 

TCLソリューション

しかし、IあなたにしようTclでこのアプローチを傾けて、私は別の結果を与えています。誰かがこの動作

% regexp -inline "CAR_.*?_(.*)" "CAR_2_ABC_547_d" 
CAR_2_ {} 

答えて

4

枝にコメントしてくださいすることができますことは、それの好みを持っている の最初の定量化された原子と同じ好みを持っています。

ですから、最初の数量詞として.*を持っている場合、全体のREは 、貪欲になり、あなたが最初の数量詞として.*?を持っている場合、全体のREは、非貪欲になります。

最初に.*?を使用していたので、それ以上の表現はレイジーモードのみに従います。

行の末尾に$を追加すると、全体が一致します。

% regexp -inline "CAR_.*?_(.*)$" "CAR_2_ABC_547_d" 
CAR_2_ABC_547_d ABC_547_d 

参考:re_syntax

+0

私の要件は、サブを抽出することです文字列 "ABC_547_d"。私は貪欲でないように意図的に '?'を使っています。私はちょうどそれがPythonではなくTCLで動作する理由を理解したいと思います – sarbjit

+0

これは 'Tcl'に関するものです。最初の数量子は非貪欲なので、 '。*'は空文字列にのみマッチします。 '。+'を使用した場合、それはあなたに文字 'A'だけを与えます。 – Dinesh

+0

Tcl regex with groupingメソッドを使用して目的の結果を達成する方法をお勧めしますか? PerlとPythonで動作するオリジナル正規表現を見ることができます。 TCLは正規表現を扱う方法が異なりますか? – sarbjit

1

別のアプローチは、代わりに接頭辞を次のテキストをキャプチャするだけプレフィックスを削除することです:

% set result [regsub {^CAR_.*?_} "CAR_2_ABC_547_d" {}] 
ABC_547_d 
関連する問題