2014-01-18 42 views
15

ためのハイフンを除くすべての句読点を削除し、私持っている正規表現文字列からすべての句読点を除去するため、このコード:Pythonの正規表現、Unicode文字列

import regex as re  
re.sub(ur"\p{P}+", "", txt) 

がどのようにハイフンを許可するように変更するのでしょうか?あなたがどのようにそれをやったのか説明できるなら、それは素晴らしいでしょう。私はここでそれを理解する、私が間違っている場合はそれを修正し、句読点の後に何かを付ける。

+3

@ジェリー - 私はちょっと見て、これを見つけました:http://stackoverflow.com/a/4316097/7586これは 'regex'であり、' re'ではありません。彼らは2つ持っていると思います。 – Kobi

+0

@ Kobiああ...それはそれを説明すると思います。 – Jerry

答えて

18
[^\P{P}-]+ 

\P\pの補完的である - ない句読点。したがって、これはではなく、(句読点やダッシュではありません)と一致し、ダッシュ以外のすべての句読点になります。

例:あなたは非複雑な方法をしたい場合はhttp://www.rubular.com/r/JsdNM3nFJ3

、代替が\p{P}(?<!-)次のとおりです。すべての句読点にマッチし、それが(負の後読みを使用して)ダッシュませんでした確認してください。
の作業例:http://www.rubular.com/r/5G62iSYTdk

+1

よかった、ありがとう。複数の除外はどうですか?といった '。'同じように。 – John

+1

@Anonymous - 最初のものは '[^ \ P {P} \ - 。] +'と2番目の '\ p {P}(?<![\ - 。])'です。かなり簡単。 – Kobi

+0

なぜ{\}は{P}の後に置いて最初のものではないのですか? – John

0

あなたは[._,]のように、手動で削除したい句読点を指定するか、代わりに置換文字列の機能を提供することができ、次のいずれか

re.sub(r"\p{P}", lambda m: "-" if m.group(0) == "-" else "", text) 
6

ここ場合には、標準ライブラリに固執する必要があり、reモジュールでそれを行う方法は次のとおりです。

# works in python 2 and 3 
import re 
import string 

remove = string.punctuation 
remove = remove.replace("-", "") # don't remove hyphens 
pattern = r"[{}]".format(remove) # create the pattern 

txt = ")*^%{}[]thi's - is - @@#!a !%%!!%- test." 
re.sub(pattern, "", txt) 
# >>> 'this - is - a - test' 

パフォーマンスの問題は、あなたがstr.translateを使用する可能性がある場合は、以来、 it's faster than using a regex。 Python 3では、コードはtxt.translate({ord(char): None for char in remove})です。

+1

ここで 're'は' \ p'を持つ[このモジュール](https://pypi.python.org/pypi/regex)を指します。 –