2016-10-21 8 views
0

単語の中にある記号(a-zA-Z、0-9および_で構成されていてもよい)を保持するが、他のすべての記号文字列内の記号を削除する別の方法

For example: 
Input String - hell_o ? my name _ i's <hel'lo/> 
Output - ['hell_o' ,'my', 'name', '_', "i's" ,'hel'lo'] 

私が使用しています機能:単語外

l = ' '.join(filter(None,(word.strip(punctuation.replace("_","")) for word in input_String.split()))) 
l = re.sub(r'\s+'," ",l) 
t = str.split(l.lower()) 

私はこれが最善、最適な方法ではありません知っている!!誰もが、私は正規表現おそらく??試すことができます任意の選択肢を推奨していこれをする??

  • 私が使用してみました: 周りの負の外観と尻を見て:\W+(?!\S*[a-z])|(?<!\S)\W+

  • s.strip(punctuation)

  • re.sub('[^\w]', ' ', doc.strip(' ').lower()) - これは、単語内の句読点を削除しすぎ

+2

*あなたは*これは、あなたが心の中でいくつかの選択肢を持っている必要があります '' '最高optimal'''の方法ではないことがわかっている場合 - (問題の)それらを記入してくださいあなたがそれらを拒否する理由、私たちは何をしないのかを知っています。 – wwii

答えて

1

あなたが一致することができますあなたと同じようにa-zA-Z, 0-9 and _以外の文字言い換えれば、2文字の間に(?<=[a-z])\W(?=[a-z])とそれを取り除くために何も置き換えてください。

最終的には、I'm fine.And you?の文章で非常に危険なアルゴリズムを使用します。ドットの後ろに空白がない場合は、I'm fineAnd you?になります。あなたのコメントの後


[EDIT]

私はあなたの質問に誤解しました。

(?<![a-z])[a-z][^\s]*[a-z](?![a-z])

は今、私はあなたが'hell_o' ,'my', 'name', "i's" ,'hel'lo'を選択したい1つの正規表現と一緒に来。

ここでは、https://regex101.com/r/EAEelq/3が動作しています。 (igフラグを忘れないでください)。 (?<![a-z_])[a-z_][^\s]*[a-z_](?![a-z_])|(?<=)[a-z_](?=):あるとして


[EDIT]あなたはまた、あなたがアンダースコアにもマッチすることにしたいので、もし単語

OK外_をマッチさせたいように更新します。

それはここで働いてください:https://regex101.com/r/EAEelq/4

+0

うん!!提案してくれてありがとう!!しかし、この正規表現は目的を解決しません!!私はいくつかの例でそれを試しました!!しかし期待どおりに動作しません。例えば、入力文字列は 'こんにちは! d?o

+0

regExが私がすでに行ったことよりも「唯一の」より良いアプローチであるなら、私は意味しました!! –

+1

あなたのコメントの後に自分の回答を編集しました。 – antoni

関連する問題