2011-08-12 12 views
1

私はPythonで正規表現を使用して、有効なドメイン名内のラベルと一致するようにしようとしている:先読みアサーション

DOMAIN_LABEL_RE = """ 
\A(
(?<![\d\-]) # cannot start with digit or hyphen, looking behind 
([a-zA-Z\d\-]*?) 
([a-zA-Z]+)# need at least 1 letter 
([a-zA-Z\d\-]*?) 
(?!\-) # cannot end with a hyphen, looking ahead 
)\Z 
""" 

私が先頭にハイフンを避けるために、正と負のアサーションを使用しようとしていますまたはラベルの最後に挿入します。

しかし、文字列 "-asdfは" まだ一致した:それはまだ一致している理由 e.match(DOMAIN_LABEL_RE、 "-asdf"、re.VERBOSE).group()

は、私は理解していません。

ありがとうございました。

M.

+1

あなたは先と後ろが交換されています。 – tchrist

答えて

3

\Aは、文字列の先頭と一致して、その位置の前に何のハイフンがない場合は、次の後読みが一致します。

あなたは文字列の先頭にありますが、もちろんその前に文字はありません!

(?![\d\-])の代わりに否定的な先読みを使用してください。

文字列の最後に似ています。代わりに(?<!\-)のネガティブな逆ビハインドを使用する必要があります。

私はあなたの現在の1に相当する表現があることだと思う:

DOMAIN_LABEL_RE = """ 
(?i    # case insensitive 
    \A(
    ([a-z])  # need at least 1 letter and cannot start with digit or hyphen 
    ([a-z\d-]*?) 
    (?<!-)  # cannot end with a hyphen 
)\Z 
) 
""" 

注:私は式はあなたが解決しようとしている問題のために実際に適しているかどうかをチェックしませんでした。

+2

あなたがいる間、 '(?<! - )'を '[a-z \ d]'に置き換えてください。 LookaheadとLookbehindはこの仕事に応募する必要はありません。 –

+0

@Alan:以前はこれを持っていましたが、ハイフン*を気にしていなかったので、ネガティブな視線は意図をより良く伝えます。もちろん、*文字や数字で終わらなければならない*:D –

+0

@Felix、ありがとう。これは、(?i)に対する小文字の修正で動作します。 – morfys