Python查找匹配特定格式的格式
我有一个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 个回答
1
reg = re.compile(r'\[[A-Z][0-9]\][0-9][A-Z]{2}[0-9]#[0-9]') 这个代码对我来说很好用...
- 符号用来表示一个范围,而 [] 这个符号需要加上转义符,因为根据定义,[] 是用来匹配一组字符的。如果你需要一个不受地区影响的解决方案,你也可以使用 Unicode 字符类来实现这个功能。
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]:
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
>>>