web-dev-qa-db-ja.com

一部の特別な文字と「:)」を除くすべての文字を照合するための正規表現

#@:):(を除くすべての文字を文字列から削除しようとしています。例:

this is, a placeholder text. I wanna remove symbols like ! and ? but keep @ & # & :)

結果は次のようになります(一致した結果を削除した後):

this is a placeholder text I wanna remove symbols like  and  but keep @  #  :)

私は試した:

(?! |#|@|:\)|:\()\W

動作していますが、:):(の場合、:はまだ一致しています。すべての文字と前の文字をチェックしているため、一致していることがわかります。たとえば、:):のみに一致しますが、:)):)に一致します。

8
mAhMoUdDaFeR

特定のホワイトリストを除くすべてのシンボルを削除したいので、これは難しい質問です。さらに、ホワイトリストの一部の記号は、実際には2つの文字で構成されています。

:)
:(

これを処理するには、最初にコロン:と括弧の両方を節約し、次にスマイリーフェイスや眉をひそめている顔の一部でない場合はどちらかを選択的に削除します。

input = "this is, a (placeholder text). I wanna remove symbols like: ! and ? but keep @ & # & :)"
output = re.sub(r'[^\w\s:()@&#]|:(?![()])|(?<!:)[()]', '', input)
print(output)

this is a placeholder text I wanna remove symbols like  and  but keep @ & # & :)

私が使用した正規表現の文字クラスは次のとおりです。

[^\w\s:()@&#]

これは、Wordまたは空白文字ではないすべての文字に一致します。また、ホワイトリストを交換から除外します。交代の他の2つの部分では、コロンと括弧を削除して、このロジックをオーバーライドしますnotスマイリーフェイスの一部である場合。

7
Tim Biegeleisen

他の人が示しているように、問題を組み立てた方法で成功する正規表現を書くことは可能です。しかし、これは、必要なものに一致する正規表現を作成する方がはるかに簡単な場合ですkeep。次に、それらのパーツを結合します。

import re

rgx = re.compile(r'\w|\s|@|&|#|:\)|:\(')
orig = 'Blah!! Blah.... ### .... #@:):):) @@ Blah! Blah??? :):)#'
new = ''.join(rgx.findall(orig))
print(new)
5
FMc

次の正規表現(Pythonの場合)を試すことができます。

(\w|:\)|:\(|#|@| )

この偽の文で:

「特定の文字を削除したいが、#random、:)、:(などの特定の文字と@のようなものを保持したい。

別の文で見つかった場合は:)、検索してください:( "

質問で言及したすべての文字が検索されます。これを使用して、それを含む文字列を検索し、この文字列から他の句読点を注意深く削除するルールを作成できます。

2
adjective_noun

単純なアプローチを使用することもできます。一致から「除外」する必要があるものを一致させてキャプチャし、削除するものと一致させてから、キャプチャグループ値への後方参照を使用します。

re.sub(r'([#@\s]|:[)(])|\W', r'\1', s)
#        ^---Group 1--^->->->->^^         

正規表現デモ を参照してください。ここに、 ([#@\s]|:[)(])一致し、キャプチャをグループ1 a #@、空白文字または:(または:(部分文字列と\W単語以外の文字をキャプチャせずに一致します。

Pythonデモ を参照してください:

import re
s="this is, a placeholder text. I wanna remove symbols like ! and ? but keep @ & # & :)"
print(re.sub(r'([#@\s]|:[)(])|\W', r'\1', s))
# => this is a placeholder text I wanna remove symbols like  and  but keep @  #  :)

Python 3.5より前のバージョンでは、ラムダ式を置換引数として使用します(バグのため):

re.sub(r'([#@\s]|:[)(])|\W', lambda x: x.group(1) if x.group(1) else '', s)
1