0

CSVファイルにデータのリストがあります。

ループを使用してフィールドにします...このタイプのコードと一致しないコード内のフィールドを検索するコードが必要です"[A9]9AA9#9"「A」は任意の文字であり、「 9"は任意の数にすることができます。ただし、[]と#記号はフォーマットと同じ場所にある必要があります。

def code():
    match= 0
    tree_file.readline() # skip first row
    for row in tree_file: 
        field=row.strip()
        field=field.split(",") # make Into fields
        code=(field[4])        
        if code != "[X9]9XX9#9":   #HERE SHOULD BE THE CODE
            match+=1        

利用可能な他の解決策が私の問題にどのように関連しているか理解できないので、私がそれらを理解できるように、コードにコメントを残してください。

4

3 に答える 3

2

次の正規表現を使用してみてください。これは、小文字と大文字([a-zA-Z])、およびそれぞれの場所の数字()を受け入れます\dpattern最初に、一致させようとしている正規表現であるをコンパイルします(より詳細な正規表現の説明については、ここを参照してください)。次に、を使用re.matchして、入力文字列をパターンに「一致」させようとします。パターンが一致する場合、group()メソッドは一致したグループを返します。そうでない場合は、re.match()が返さNoneれます(これは、以下で行ったよりもうまく処理できます:)):

In [11]: import re

In [12]: pattern = re.compile(r'\[[a-zA-z]\d\]\d[a-zA-Z]{2}\d#\d')

In [13]: re.match(pattern, '[X9]9XX9#9').group()
Out[13]: '[X9]9XX9#9'

In [14]: re.match(pattern, '[Z7]3JK2#1').group()
Out[14]: '[Z7]3JK2#1'

In [15]: re.match(pattern, '[ZZ]3JK2#1').group()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-15-48efdbbda230> in <module>()
----> 1 re.match(pattern, '[ZZ]3JK2#1').group()

AttributeError: 'NoneType' object has no attribute 'group'

一致しないケースを処理する1つの方法は、結果を変数に割り当て、それが何かを返すかどうかに基づいて処理することです。

In [16]: match = re.match(pattern, '[ZZ]3JK2#1')

In [17]: if match:
   ...:     print match.group()
   ...:     

In [5]: 
于 2013-02-04T17:33:36.733 に答える
1

必要な正規表現は次のとおりです。

r'\[[A-Za-z][0-9]+\][0-9]+[A-Za-z]{2}[0-9]+#[0-9]+'

したがって、コードは次のようになります

import re

if re.search(r'\[[A-Za-z][0-9]+\][0-9]+[A-Za-z]{2}[0-9]+#[0-9]+', code) is None:
    match += 1  

説明

[A-Za-z] : matches any alphabet
[0-9]+ : matches one or more digits
[A-Za-z]{2} : matches two alphabets

出力

>>> import re
>>> s = "[X9]9XX9#9"
>>> re.search(r'\[[A-Za-z][0-9]+\][0-9]+[A-Za-z]{2}[0-9]+#[0-9]+', s) is None
False
>>> s = "ABCD"
>>> re.search(r'\[[A-Za-z][0-9]+\][0-9]+[A-Za-z]{2}[0-9]+#[0-9]+', s) is None
True
>>> s = "[A123]456BB8#789"
>>> re.search(r'\[[A-Za-z][0-9]+\][0-9]+[A-Za-z]{2}[0-9]+#[0-9]+', s) is None
False
>>> 
于 2013-02-04T17:32:04.427 に答える
1

reg = re.compile(r'\[[A-Z][0-9]\][0-9][A-Z]{2}[0-9]#[0-9]')私のために働く...

-演算子は範囲を定義し、[]はエスケープする必要があります。定義上[]演算子は文字のセットと一致します。ロケールに依存しないソリューションが必要な場合は、Unicode文字クラスを使用してこれを行うこともできます。

于 2013-02-04T17:40:11.670 に答える