2011-01-21 10 views
2

私はいくつかのフリーテキストを作成しています。私はいくつかのデータクリーニングをする必要があります。質問があります(多くのうち、後で私は確信します)。特定の文字の周りの空白を置き換えるには?

次の組み合わせを置き換える必要があります:

[ ; ](句読点の前にスペースのみ)(句読点の前後にスペースなし)(句読点の前後のスペース)

[;]

[ ;]

句読点が[;:,.]のいずれかになります(句読点の後にスペースのみ)

...

[; ]

へ。正規表現を使ってこれをどうすればできますか?

+0

プログラミング言語またはツールとは何ですか?これまでに何を試しましたか? – tchrist

+0

あなたは文章の句読点を掃除しているようです。それが本当であれば、 '!'(感嘆符)にもマッチしてはいけませんか? –

答えて

6

可能式は次のようになります。

\s?([;:,.])\s? 

し、使用しているプログラミング言語やツールに応じて、あなたは後方参照のために$1\\1または\1を使用する必要があり、交換は、例えばだろう$11の後ろにスペースがあります)。

説明:再びcharacter classcapture groupquantifier

:しかし

\s?  - match at most one whitespace character 
(...) - capture group, storing the matched characters in a reference 
    [...] - character class, matching one of the characters inside 

参照表現は、使用しているツール/言語に応じて、異なる場合があります。例えば。

/ *\([;:,.]\) */\1/

が、これはまた、句読点の前後にスペースをトリムでしょう(より良い方法はおそらくありますが、私はsedとそれほど慣れていないよ):sedのための同様の表現は次のようになります。

+0

+1しかし、@ルーカスは正しいと思います。 –

0

それはあなたが掃除フォーム、[; ]にそれを移動する方法をを上使用しているどのような言語に依存しますが、[;:,.]のように、[]で囲むことにより、句読点のいずれかに一致することができます。

パターンが完成したら、クリーンバージョンとのマッチングを置き換えることができます。少なくともJavaでは、"\[$<GroupNumber> \]"のようなものに置き換えることができます。<GroupNumber>は、グループの順序に基づいて、括弧でくくられたグループに1,2,3などのような句読記号が付けられています。

使用している言語によっては、バックスラッシュをエスケープする必要があります。上記のすべての例でJavaを使用している場合は、\の代わりに\\を使用する必要があります。

+2

ほとんどの(私はすべてを想定しています)フレーバーでは、ドットは文字クラスでエスケープする必要はありません。始めと終わりではなく、どこでも '^'と ' - 'のみが文字クラスで特別です。 –

+0

そうです!私は考えていませんでした:-p Good catch –

+1

@Felix Kling:そして、もちろん、...] –

2

私は\s*([;:,.])\s*を使用し、'$1 'と置き換えます(バックリファレンス後にスペースを強調するために一重引用符が追加されています)。これは、Felixの最初の提案と最後の提案の間のクロスです。そのため、タブや改行を含む複数のスペースをきれいにすることができます。

+0

+1 - これは私がやる方法です。 –

関連する問題