0

2 つの文字列がPG((0,0), (0,1), (1,1), (1,0))ありP(1,1)
、正規表現を使用してこれらの文字列を識別するコードを記述する必要があります。

これまでのところ、私はこれを持っています:

if(re.search("^[P\(]",line) is not None):
    print "P found"

これは両方の文字列を識別しますが、識別できるのはP(1,1)

if(re.search("^[PG\(\(]",line) is not None):
    print "PG found"

これも両方の文字列を識別しますが、識別できるのはPG((0,0), (0,1), (1,1), (1,0))

ここで何が間違っていますか?

4

2 に答える 2

3

正規表現は文字クラスを使用しています ( 内のもの[])。これは、「これらの文字のいずれかに一致する」ことを意味します。したがって、最初の 1 つは「P」または「(」で始まる任意の文字列に一致し、2 つ目は「P」、「G」または「(」で始まる任意の文字列に一致します。最も簡単な修正は、文字を削除することです。クラス -- 例:

re.search(r"^PG\(\(",line)

「生の文字列」(接頭辞が の文字列r) を使用したことに注意してください。これにより、Python が通常の文字のエスケープを行うことができなくなります。また、使用re.searchを からre.matchに変更すると、行アンカーの先頭を取り除くことができることに注意してください。

re.match(r"PG\(\(",line)

asre.matchは、文字列の先頭からのみ機能します。それは正規表現をわずかに単純化します。正規表現を扱うとき、可能な限り単純化する価値があると思います。その点で、ここで正規表現をすべて忘れて、単に使用することもできstr.startswithます:

if line.startswith('PG(('):
   ...
elif line.startswith('P('):
   ...
于 2013-05-16T22:24:49.867 に答える
0

角括弧は文字セットをマークするため、削除します。使用する:

if(re.search(r"^P\(",line) is not None):

以前のバージョンが両方の式に一致していた理由は、P or \(をテストし、両方に開き括弧が含まれているためです。

于 2013-05-16T22:24:07.240 に答える