重複する部分文字列を削除する方法

Codious-JR:

私は自分自身を複製し、文字列の部分を持っている、と私は、文字列内の単語の順序を失うことなく、すべての重複「のサブストリング」を削除します。

例えば: "12 PL DE LA HALLE BP 425 BRIVE-LA-GAILLARDE BP 425 BRIVE-LA-GAILLARDE BP 425 BRIVE-LA-GAILLARDE BP 425 BRIVE-LA-GAILLARDE"

ここでは"BP 425 BRIVE-LA-GAILLARDE"、それ自体を4回繰り返します。

私は、文字列が最終的になりたい"12 PL DE LA HALLE BP 425 BRIVE-LA-GAILLARDE"重複が削除されているところ。

私の一般的なスクレーパーモジュールの1つは、特定のHTML要素からすべてのテキスト要素を収集している場合、この問題が発生しています。HTML要素には同じ情報が複数回繰り返されるが、CSSを使って隠されています。私はデ・複製部分文字列の一般的な方法を探しています理由です。

複製された部分文字列のより多くの例:

 "TOUR SOCIETE SUISSE 1 BD VIVIER MERLE 1 BD VIVIER MERLE"
      => "TOUR SOCIETE SUISSE  1 BD VIVIER MERLE"

 "2 PARC DES ERABLES 66 RTE DE SARTROUVILLE 66 RTE DE SARTROUVILLE"
      => "2 PARC DES ERABLES  66 RTE DE SARTROUVILLE"

 "CASERNE AUDEOUD 111 AV DE LA CORSE 111 AV DE LA CORSE"
      => "CASERNE AUDEOUD  111 AV DE LA CORSE"

:単語が繰り返されているが、例えば重複していないとき場合にはので、同じ言葉を繰り返さないための簡単な方法は、二度、ここでは動作しません"12 PL DE LA HALLE BP 425 BRIVE LA GAILLARDE BP 425 BRIVE LA GAILLARDE"、ここでBRIVEとガイヤルド間の「LA」は削除されます。

出力は次のようになります。"12 PL DE LA HALLE BP 425 BRIVE GAILLARDE" 実際の所望の出力である一方。"12 PL DE LA HALLE BP 425 BRIVE LA GAILLARDE"

私の勘では、1つの単語の順序を比較する必要がありますです。しかし、ないように注意してください正確にどのように。

すべてのヘルプは大歓迎しました。

ティムBiegeleisen:

ここでは、潜在的に実行可能な正規表現ベースのソリューションは以下のとおりです。

inp = "12 PL DE LA HALLE  BP 425 BRIVE-LA-GAILLARDE  BP 425 BRIVE-LA-GAILLARDE  BP 425 BRIVE-LA-GAILLARDE  BP 425 BRIVE-LA-GAILLARDE"
while True:
    out = re.sub(r'(?<!\S)(\S+(?:\s\S+)*)\s+\1(?!\S)', '\\1', inp)
    if out == inp:
        break
    inp = out
print(out)

この版画:

12 PL DE LA HALLE  BP 425 BRIVE-LA-GAILLARDE

ここでの考え方は同じフレーズが続き、その後、ちょうど1枚目の撮影のフレーズと交換するために、任意のフレーズを一致させることです。

私たちは、再帰を使用してre.sub、一度ので、ここではPHRASE PHRASE1つだけで処理し、交換されているPHRASE残りのフレーズが再び使用されないこと、。

ここでは、正規表現パターンの説明は次のとおりです。

(?<!\S)         assert what precedes is either whitespace or the start of the string
(               match AND capture the following in \1
    \S+         match one or more non whitespace characters (i.e. a "word")
    (?:\s\S+)*  then match a space followed by another word, zero or more times
)
\s+             match one or more whitespace characters
\1              then match the same phrase we just saw         
(?!\S)          assert that whitespace or the end of the string follows

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=21571&siteId=1