正規表現の代わりに、文字列関数を使用できます。
to_be_removed = ".,:!" # all characters to be removed
s = "John's mom went there, but he wasn't there. So she said: 'Where are you!!'"
for c in to_be_removed:
s = s.replace(c, '')
s.split()
しかし、あなたの例では、アポストロフィを削除したくありませんが、 で削除したいと考えてJohn's
いますyou!!'
。そのため、文字列操作はその時点で失敗し、細かく調整された正規表現が必要です。
編集:おそらく単純な正規表現で問題を解決できます:
(\w[\w']*)
文字で始まるすべての文字をキャプチャし、次の文字がアポストロフィまたは文字である間、キャプチャを続けます。
(\w[\w']*\w)
この 2 番目の正規表現は、非常に特殊な状況のためのものです....最初の正規表現は、 のような単語をキャプチャできますyou'
。これはこれを回避し、アポストロフィが単語内にある場合にのみアポストロフィをキャプチャします (先頭または末尾ではありません)。Moss' mom
しかし、その時点で、2番目の正規表現でアポストロフィをキャプチャできないという状況が発生します。wit で終わり、所有権を定義する名前の末尾のアポストロフィをキャプチャするかどうかを決定する必要があります。
例:
rgx = re.compile("([\w][\w']*\w)")
s = "John's mom went there, but he wasn't there. So she said: 'Where are you!!'"
rgx.findall(s)
["John's", 'mom', 'went', 'there', 'but', 'he', "wasn't", 'there', 'So', 'she', 'said', 'Where', 'are', 'you']
更新 2: 正規表現にバグが見つかりました! のようにアポストロフィが続く単一文字をキャプチャすることはできませんA'
。修正された新しい正規表現は次のとおりです。
(\w[\w']*\w|\w)
rgx = re.compile("(\w[\w']*\w|\w)")
s = "John's mom went there, but he wasn't there. So she said: 'Where are you!!' 'A a'"
rgx.findall(s)
["John's", 'mom', 'went', 'there', 'but', 'he', "wasn't", 'there', 'So', 'she', 'said', 'Where', 'are', 'you', 'A', 'a']