7

Python RegEx の特殊なシーケンス (文字クラス) は、一連の文字に一致する、\wまたは一致するエスケープ\dです。

私の場合、数字を除くすべての英数字に一致できる必要があります。

つまり\wマイナス\dです。

非ASCII\w文字を扱っており、「Æ」や「Ø」などの記号と一致させる必要があるため、特別なシーケンスを使用する必要があります。

次の表現を使用できると思われるかも[\w^\d]しれませんが、何にも一致しないようで、理由がわかりません。

要するに、Python正規表現で特別なシーケンスをどのように混合(追加/減算)できますか?


編集[\W^\d]:の代わりに誤って使用しました[\w^\d]。後者は確かに、私に関する限り、英数字ではない括弧やコンマを含む何かに一致します。

4

4 に答える 4

14

を使用できますr"[^\W\d]"。非英数字と数値の和集合を反転します。

于 2012-09-10T10:11:45.030 に答える
6

文字クラスを差し引くことはできません。

最善の策は、Pythonの現在のモジュールを置き換えるように設定された新しいregexモジュールを使用することです。reUnicode プロパティに基づく文字クラスをサポートしています。

\p{IsAlphabetic}

これは、Unicode 仕様がアルファベット文字であると述べている任意の文字に一致します。

さらに良いことに、文字クラスの減算をサポートregex しています。--このようなクラスをセットとして表示し、演算子を使用して違いを生み出すことができます。

[\w--\d]

\wは、 にも一致するものを除くすべてのものに一致し\dます。

于 2012-09-10T09:48:43.467 に答える
2

r'(?!\d)[\w]'数字を除外して単語の文字に一致させるなど、否定先読みアサーションを使用してクラスを除外できます。例えば:

>>> re.search(r'(?!\d)[\w]', '12bac')
<_sre.SRE_Match object at 0xb7779218>
>>> _.group(0)
'b'

複数のグループを除外する[...]には、先読みアサーションで通常の構文を使用できます。たとえばr'(?![0-5])[\w]'、数字 0 ~ 5 を除く任意の英数字に一致します。

と同様に[...]、上記の構文は単一の文字に一致します。複数の文字に一致させるには、繰り返し演算子を追加します。

>>> re.search(r'((?!\d)[\w])+', '12bac15')
<_sre.SRE_Match object at 0x7f44cd2588a0>
>>> _.group(0)
'bac'
于 2012-09-10T10:08:28.070 に答える
1

否定されているかどうかに関係なく、単一の正規表現で(ブール値と)文字セットを直接組み合わせることができるとは思いません。[^\d]それ以外の場合は、とを単純に組み合わせることができます\w

注: は^セットの先頭にある必要があり、セット全体に適用されます。ドキュメントから: 「セットの最初の文字が '^' の場合、セットにないすべての文字が一致します。」. セット[\w^\d]は、英数字、キャレット、数字の順に一致させようとします。それも何にも一致しないと想像できます。

正規表現を効果的に組み合わせて、2 つのステップでそれを行います。最初に非数字 (内部正規表現) で一致し、次に英数字で一致します。

re.search('\w+', re.search('([^\d]+)', s).group(0)).group(0)

またはこのテーマのバリエーション。

2 つの正規表現のいずれかが失敗した場合try: except:にスローされるため、これをブロックで囲む必要があることに注意してください。AttributeError: 'NoneType' object has no attribute 'group'もちろん、この 1 行をさらに数行に分割することもできます。

于 2012-09-10T10:06:01.100 に答える