2017-12-13 21 views
1

Rにはstringiという強力な文字列処理パッケージがあります。特に、私はstri_replace_all_fixed関数と同じようにしたいと思います:Perl/PHP/PythonやC#と言うようにリスト/辞書に基づいてマッチを置き換えます。stri_replace_all_fixed equivalent:リストに基づく値を置き換えます

#install.packages("stringi") 
library(stringi) 
stri_replace_all_fixed("The quick brown fox jumped over the lazy dog.", 
    c("quick", "brown", "fox"), c("slow", "black", "bear"), vectorize_all=FALSE) 

出力:

"スロー黒クマは、怠惰な犬を飛び越えました。"

+0

あなたの出力にはどのような出力がありますか? – afc11hn

+0

@ afc11hn良い点、私は出力とより詳細なRのサンプルを追加しました。 – wp78de

答えて

2

その代替と交換する単語をマッピングするためのハッシュを使用します。

use warnings; 
use strict; 
use feature 'say'; 

my $string = 'The quick brown fox jumped over the lazy dog.'; 

my @words  = qw(quick brown fox); 
my @change_to = qw(slow black bear); 

my %replacement; 
@replacement{@words} = @change_to; # populate hash: quick => 'slow', ... 

my $pattern = join '|', map { quotemeta } sort { length $a < length $b } @words; 

$string =~ s/($pattern)/$replacement{$1}/g; 

say $string; 

長い単語は短いものの前に来るように、私たちは、彼らのlengthによってパターンのsortコンポーネントに必要な注意。そうでない場合は/no|none/'no''none'という単語に置き換えられます。

希望のインターフェースとサブルーチンで包み、あなたが与えられた試合の代替として使用される文字列を返すようにre.subに交換用の関数を渡すことができますPythonで

sub_name($string, \@words, \@change_to); 
+0

素晴らしいです、私はそれが好きです! – wp78de

+0

@ wp78de偉大な:)私は説明を追加しました(長さでソートするために) – zdim

1

一般的なアプローチは、次のとおりです。

  1. は辞書にすべてのキーに一致する正規表現
  2. マッチに正規表現をコンパイルし、各試合を置き換えるその代替
  3. に対応付ける辞書の単語を作成します一致したキーの辞書値。 Perlで

、そのような機能は次のようになります。

sub replace_all { 
    my ($string, %replacements) = @_; 
    # Assemble the regex. 
    # Sort reverse so that longer keys are matched first. 
    # Quotemeta each key in order to escape special characters. 
    my $pattern = join '|', map quotemeta, reverse sort keys %replacements; 
    $string =~ s/($pattern)/$replacements{$1}/g; # replace all 
    return $string; 
} 

テスト:

use Test::More; 
my $output = replace_all(
    "The quick brown fox jumped over the lazy dog.", 
    quick => 'slow', 
    brown => 'black', 
    fox => 'bear'); 
my $expected = "The slow black bear jumped over the lazy dog."; 
is $output, $expected; 
done_testing; 
+0

良かった、ありがとう。 – wp78de

1

を言います。最初にすべてのパターンとその置換を含む辞書を作成してから、適切な置換文字列を使用する検索機能を作成することができます。

import re 


def stri_replace_all_fixed(stri, patterns, replacements): 
    pattern_to_replacement = {p: r for p, r in zip(patterns, replacements)} 

    def switch(match): 
     return pattern_to_replacement[match.group(0)] 

    # To make sure that longer patterns are matched first 
    # we sort the list by the length of its elements and reverse it 
    patterns = sorted(patterns, key=len, reverse=True) 

    print(re.sub('|'.join(patterns), switch, stri)) 


pattern = "quick", "brown", "fox" 
replace = "slow", "black", "bear" 
stri_replace_all_fixed("The quick brown fox jumped over the lazy dog.", pattern, replace) 
+1

"これは有用かどうかは絶対にわかりません" - それは絶対に必要ですが、あなたが持っている方法は間違っています**、このようにPerlでも間違っています。パターン 'p1 | p2 | ... 'は、最長の単語が最初に来るように構築する必要があります。そうでなければ、短いサブワードが間違って置き換えられることがあります( ''何もない 'では' no'、対象では '' no''の前に ''何も起こらないとき)。しかし、Perlの 'sort'ではデフォルトでそれがアルファベット順に行われています。ここでは長さでそれを必要としています。私の答えを見てください。 Pythonでは、 'sorted'と' key'パラメタを使いたい方にも、それを伝えなければなりません。それを修正してください。 – zdim

+0

答えを更新しました。なぜこれがとても重要であるか説明していただきありがとうございます。 – afc11hn

関連する問題