Python寻找与特定格式匹配的格式

时间:2013-02-04 17:27:51

标签: python format match

我在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        

请您在代码中留下一些评论,以便我能理解它们,因为我无法理解其他可用的解决方案与我的问题有什么关系。

3 个答案:

答案 0 :(得分: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]: 

答案 1 :(得分: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
>>> 

答案 2 :(得分:1)

reg = re.compile(r'\[[A-Z][0-9]\][0-9][A-Z]{2}[0-9]#[0-9]')适合我...

-运算符定义了一个范围,[]必须进行转义,如definition所示,[]运算符与一组字符匹配。如果需要与语言环境无关的解决方案,也可以使用Unicode字符类来执行此操作。

相关问题