2017-08-09 4 views
0

Python3でプログラミングする。Python:文字列が特定の書式を満たしているかどうかを調べる

文字列が特定の形式を満たしているかどうかを制御するのが難しいです。

私は、PythonにはJavaのように.contain()というメソッドはありませんが、正規表現を使用できることはわかっています。 これで、私のコードはおそらくこのように見えます。ここで、lowpan_headersは、特定のフォーマットを満たす文字列であるフィールドを持つ辞書です。 ように、コードは、おそらくこのようになります:

import re 

lowpan_headers = self.converter.lowpan_string_to_headers(lowpan_string) 
pattern = re.compile("^([A-Z][0-9]+)+$") 
pattern.match(lowpan_headers[dest_addrS]) 

はしかし、私の問題はフォーマットであり、私はそれが権利を取得することができていません。 形式はbbbb00000000000000170d0000306fb6のようにしてください。最初の4文字はbbbbで、残りはすべて正確な長さで16進数でなければなりません(0-9と-fから)。

2つの質問 (1)再インポートを除いてこれを行う簡単な方法 (2)そうでない場合、正規表現で私を助けてくれますか?私は

^bbbb[0-9a-f]{28}$ 

が要件に対して正しく検証する必要があることを信じて、あなたが探している正規表現については

+0

Python ** does **は "contains"を持っています** https://stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method – Asunez

+0

Python * * 'Java.lang.String.contains'のようなものを持っていますが、' in'演算子を使用します: 'string1 in string2'ですが、あなたの仕様ではあなたのように聞こえます*実際には正規表現が必要です* –

+0

この正規表現はあなた: 'r '^ b {4} [0-9a-f] {28} $''? – ikkuh

答えて

5

reモジュールを使用するより簡単な方法があるかどうかは、探している結果が実際には得られないと言います。 Pythonでinキーワードを使用するのは、文字列に対してcontainsメソッドが動作すると予想される方法で動作しますが、実際には文字列が正しい形式であるかどうかを知りたいと思っています。そのような最善の解決策は、比較的簡単なので、正規表現を使用して、reモジュールを使用することです。

0

Python で述べたように、にはがあります。あなたが入力を検証する代わりに正規表現を使用することを好む場合

if "blah" not in somestring: 
    continue 

(source)(PythonDocs)

、あなたはこれを使用することができます。

^b{4}[0-9a-f]{28}$ - ここRegex101 Demo with explanation

1

はないソリューションです使用regex

lowpan_headers = 'bbbb00000000000000170d0000306fb6' 
if lowpan_headers[:4] == 'bbbb' and len(lowpan_headers) == 32: 
    try: 
     int(lowpan_headers[4:], 16) # tries interpreting the last 28 characters as hexadecimal 
     print('Input is valid!') 
    except ValueError: 
     print('Invalid Input') # hex test failed! 
else: 
    print('Invalid Input') # either length test or 'bbbb' prefix test failed! 
1

実際、Pythonには.contains()メソッドと同等のものがあります。同様の質問がすでにhereに答えてきた

if 'substring' in long_string: 
    return True 

:あなたはin演算子を使用することができます。

しかし、実際に特定のString形式を評価しようとしているので、私はまだ正規表現に固執しています。文字列の値が0-9とa-fの16進数であることを確認するには、次の正規表現を使用します。^[a-fA-F0-9]+$追加の「合併症」は、あなたのひもの始めにある4つの「b」です。私は簡単な修正は、次のようにそれらを含めることだと思います:^(bbbb)?[a-fA-F0-9]+$

>>> import re 
>>> pattern = re.compile('^(bbbb)?[a-fA-F0-9]+$') 
>>> test_1 = 'bbbb00000000000000170d0000306fb6' 
>>> test_2 = 'bbbb00000000000000170d0000306fx6' 
>>> pattern.match(test_1) 
<_sre.SRE_Match object; span=(0, 32), match='bbbb00000000000000170d0000306fb6'> 
>>> pattern.match(test_2) 
>>> 

現在不足している部分は、文字列の長さのメソッドを使用するか、正規表現を拡張することができいずれかがために、文字列の正確な長さをチェックしている - 私はあなたがここからそれを取ることができると確信しています。 - )

関連する問題