4

Python 3.2.2では、正規表現パターンで*を使用しようとすると、奇妙なエラーが発生しました。* stads after /allokの場合。しかし、パターンから/を削除しようとすると、このコードは次のエラーで失敗します:sre_constants.error:不正な文字範囲

import re
foo = re.search("[^123+-/*]", "123+-/*w")
if foo:
    print("foo")
else:
    print("doo")

Pythonのドキュメントで、バックスラッシュやその他のものがなくても*を使用できることがわかりました。ただし、このようなコードの問題は残っています。

4

2 に答える 2

5

問題はそうではありません*。文字クラスの範囲を表すのはハイフンマイナスです。この場合は、+/+,-./)の間のすべての文字です。の前に*来るため、無効な範囲が発生します。 /

リテラルハイフンを文字クラスに含めたい場合は、それをエスケープするか、最後または最初に配置する必要があります。

[^123+/*-]
于 2012-06-02T22:14:53.720 に答える
2

マイナスは、最後の文字が文字範囲として解釈される原因になります。[+-/]acutallyは「いずれか+,-./」を意味します(ASCIIテーブルを参照)。をで置き換えると、アスタリスク42のASCIIコードがプラス43のASCIIコードよりも小さいため、無効な範囲が作成/されます。*[+-*]

解決策は、単にマイナスをエスケープすることです(その後、それはもはや範囲ではありません)。

于 2012-06-02T22:15:31.893 に答える