2011-08-04 3 views
0

XXXXX_XXXXXまたはXXXXXX_XXXXXまたはXXXXXXの形式の文字列を (Xは英数字)で検索しています。正規表現を使用して行内の文字列を検索します

"_"の前の文字列は5文字または6文字で、 "_"の後の文字列は常に5文字か、まったく6文字で、アンダースコアなしにすることができます。私はPythonでコーディングしています。

ご協力いただければ幸いです。

答えて

3

これはどのようですか?

([a-zA-Z0-9]{5,6}_[a-zA-Z0-9]{5})|[a-zA-Z0-9]{6} 

完全なコード例:

import re 
pat = re.compile(r'^(([a-zA-Z0-9]{5,6}_[a-zA-Z0-9]{5})|[a-zA-Z0-9]{6})$') 
print pat.match('xxxxx_xxxxx') is not None # True, 5 chars, underscore, 5 chars 
print pat.match('xxxxxx_xxxxx') is not None # True, 6 chars, underscore, 5 chars 
print pat.match('xxxxxx') is not None # True, 6 chars 

注:は、私が以前にこれを書いた、POSIX文字クラスをサポートしていないのpythonを実現していない

([[:alnum:]]{5,6}_[[:alnum:]]{5})|[[:alnum:]]{6} 
0
import re 

regex = re.compile("[[:alnum:]]{5,6}_[[:alnum:]]{5})|[[:alnum:]]{6}") 
here = re.search(regex, "your string") 
if here: 
    #pattern has been found 
1

輸入re 次に:

re.match("[a-zA-Z0-9]{5,6}(_[a-zA-Z0-9]{5})?", c).group() 

事前定義された\ wは "_"を英数字にしているので、ここでは使用できません。

+0

この6つの文字にマッチします、、、6つの文字を強調しています(私の質問から読んで) – jwd

+0

@jwd:いいえ、これは "XXXXXX"と同様に一致しません。 ()に注意してください。 –

+0

はい、「XXXXXX」と一致することに同意します。「XXXXXX_XXXXXX」と一致すると言っていますが、これは間違っています(afaict)。 – jwd

0

Pythonが開始および終了境界条件をデフォルトとして仮定していない場合、
、または文字列内の文字列を検索する場合、境界条件を考慮する必要があります。
それ以外の場合は、XXXXXXXXXXXXXXXXXXXXXX_XXXXXXXXXXXXXXXXXXXXXXXも一致します。

/ (?:^| [\W_])    # beginning of line or non-alphameric 
    (?: 
     [^\W_]{5,6}_[^\W_]{5} # 5-6 alphameric's, underscore, 5 alphameric's 
    | [^\W_]{6}    # or, 6 alphameric's 
) 
    (?: [\W_] | $)    # non-alphameric or end of line 
/
0

私はかなりのMichałŠrajerの答えのような、しかし、指摘されているとして、彼のバージョンも(私たちは望んでいない)だけで5 alnum文字に一致します。ここで

はその補償するために彼のバージョンの編集です:

re.match("[a-zA-Z0-9]{5}(([a-zA-Z0-9]?_[a-zA-Z0-9]{5})?|[a-zA-Z0-9])", c) 

他の回答の一部は、おそらくより読みやすいですけど...

関連する問題