2013-02-04 86 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