2013-02-04 22 views
0

我有一個CSV文件中的數據列表。Python尋找匹配特定格式的格式

我正在使用循環,使他們成爲領域......我需要一個代碼,尋找代碼中的字段不符合這種類型的代碼「[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   

請你能留在代碼中的一些評論,所以我能理解他們,因爲我無法理解如何其他的解決方案,可爲有關我的問題。

+0

使用正則表達式。 – ATOzTOA

+0

'9'可以是數字還是數字? – ATOzTOA

+0

它可以是任何東西,只要它是包括0的整數。不是像5.7和負面的東西。 –

回答

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 
>>> 
+0

+1,你先得到它(我的年齡越來越慢:))。 – RocketDonkey

+0

它給了我一個錯誤,「NameError:全局名稱''沒有被定義' 我想知道re(re.match)中re是什麼意思? –

+0

@Dragnets更新後的答案...'re'是「正則表達式」的模塊。 – ATOzTOA

2

您可以嘗試使用以下正則表達式。這將接受小寫字母和大寫字母([a-zA-Z])和各自位置的數字(\d)。我們首先編譯pattern,這是我們試圖匹配的正則表達式(有關更詳細的正則表達式解釋,請參見here)。然後,您使用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' 

一種方式來處理不匹配的情況是把結果賦值給一個變量,那麼處理的,無論是什麼返回與否:

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

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

In [5]: 
+0

@ATOzTOa可能是第一個,但你給瞭解釋。 – hd1

1

reg = re.compile(r'\[[A-Z][0-9]\][0-9][A-Z]{2}[0-9]#[0-9]')作品對我來說...

-運營商定義範圍和[]必須轉義,如definition,該[]運算符匹配一組字符。如果您需要獨立於語言環境的解決方案,則還可以使用Unicode字符類來執行此操作。

+0

+1,很好的解釋,以及:) – RocketDonkey

+0

這不會解決OP的問題,但... – ATOzTOA