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]) 以及各自位置 ( \d) 中的数字。我们首先编译pattern,这是我们试图匹配的正则表达式(见这里更详细的正则表达式解释)。然后,您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]: 
于 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 回答