2016-10-13 4 views
0

私はPython(2.7)でregexライブラリ 're'を使ってフライト番号を検証しています。Python - 関数を使ったREのREGEX問題re.compile + search

私はここで本当に役に立つオンラインエディタを使用して、期待される出力では問題がなかったしました:regexr.com上http://regexr.com/

私の結果は以下のとおりです。http://imgur.com/nB0QDug

私のコードは次のとおりです。

import re 
test1 = 'ba116' 
###Referencelink: http://academe.co.uk/2014/01/validating-flight-codes/ 
p = re.compile('/^([a-z][a-z]|[a-z][0-9]|[0-9][a-z])[a-z]?[0-9]{1,4}[a-z]?$/g') 
m = p.search(test1) # p.match() to find from start of string only 
if m: 
print 'It works!: ', m.group() # group(1...n) for capture groups 
else: 
print 'Did not work' 

私は正規表現が1つのマッチを(期待通りに)示すところで、「うまくいきません」という出力をなぜ得るのか分かりません。

私はずっとsimpしました私は正規表現の文字列が無効であるか、re.complile(またはおそらくifループ)を間違って使っているようですが、のように見えますか?

'ba116'が有効であり、一致する必要があります。

+1

コードが本当にインデントされていますか?それは構文エラーを投げているはずです。 – zwol

+1

'/'を削除して、Pythonで不要にします。それはおそらくその理由は動作していない – sisanared

+0

はい。次のように:http://imgur.com/QqK3HsX - エラーは発生しません。コードが実行され、「終了コード0で終了したプロセス」 –

答えて

1

Pythonのre.compileは、先頭の/と末尾の/gを区切り文字および修飾子ではなく正規表現の一部として扱います。コンパイル済みのREが生成されます。その前には^があり、その後には$があります。

re.compileの最初の引数はだけあなたは/.../正規表現表記を持っていた言語でスラッシュの内側に置くものを含む文字列でなければなりません。 g修飾子は、コンパイル済みREのfindallメソッドを呼び出すことに対応します。この場合は不要と思われる。 (他の修飾子の一部、例えばismre.compile引数に渡された値に対応しています。)

だから、これはあなたのコードがどのように見えるかです:

import re 
test1 = 'ba116' 
###Referencelink: http://academe.co.uk/2014/01/validating-flight-codes/ 
p = re.compile(r'^([a-z][a-z]|[a-z][0-9]|[0-9][a-z])[a-z]?[0-9]{1,4}[a-z]?$') 
m = p.search(test1) # p.match() to find from start of string only 
if m: 
    print 'It works!: ', m.group() # group(1...n) for capture groups 
else: 
    print 'Did not work' 

rオープン見積もりの​​直前には正規表現がありませんが、REでバックスラッシュを使用する必要がある場合は、すべてを2倍にする必要がありません。