意外行为在Python中的列表上迭代三个IF语句

时间:2015-03-23 21:47:27

标签: python regex list if-statement python-3.x

我试图迭代python 3.4中split()生成的列表中的项目,我无法理解为什么它不像我期望的那样工作。这是代码:

seqdes = '48 Marshall McDonald advances to 1st (single), 43 Nicholas Boggan advances to 2nd (48), 48 Marshall McDonald advances to 2nd (wild pitch), 43 Nicholas Boggan advances to 3rd (wild pitch)'
firstbaselist = []
secondbaselist = []
thirdbaselist = []

for item in seqdes.split(','):
    if re.compile('.*advances to 1st.*').match(item):
        firstbaselist.append(re.compile('\d\d').match(item).group(0))
    if re.compile('.*advances to 2nd.*').match(item):
        secondbaselist.append(re.compile('\d\d').match(item).group(0))
    if re.compile('.*advances to 3rd.*').match(item):
        thirdbaselist.append(re.compile('\d\d').match(item).group(0))

我希望这会查看seqdes.split(',')创建的四个内容中的每一个,如果找到正则表达式匹配,请将每行开头找到的两个数字追加到指定清单。相反,我得到:

Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

所以我看到代码试图在seqdes.split列表中的一个项目上运行secondbaselist.append,该列表不包含&#34;前进到第二个&#34;在任何地方,但我不知道它为什么这样做。由于if语句在那里是假的,我不会认为它会尝试追加部分;显然,我没有从if语句中获得所需的行为,但我不明白为什么。

我还尝试使用if item.find("advances to 1st")等,没有任何变化。我错过了什么?

2 个答案:

答案 0 :(得分:1)

错误是因为您使用的是re.match而不是re.searchre.matchre.search之间的差异在此解释:What is the difference between Python's re.search and re.match?

您的错误原因是re.match docs中的这一行:

  

如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的MatchObject实例。如果字符串与模式不匹配,则返回None;请注意,这与零长度匹配不同。

当您拆分字符串时,字符串中的第二项是' 43 Nicholas Boggan advances to 2nd (48)',其中有一个空格开头。由于该空格不是正则表达式的一部分,re.match会失败并返回None。这一行

secondbaselist.append(re.compile('\d\d').match(item).group(0))

变为None.group(0)且无类型对象没有属性组。

使用re.search应解决此问题。

答案 1 :(得分:1)

试试这个:

import re
seqdes = '48 Marshall McDonald advances to 1st (single), 43 Nicholas Boggan advances to 2nd (48), 48 Marshall McDonald advances to 2nd (wild pitch), 43 Nicholas Boggan advances to 3rd (wild pitch)'
firstbaselist = []
secondbaselist = []
thirdbaselist = []

for item in seqdes.split(','):
    if 'advances to 1st' in item:
        firstbaselist.append(re.search(r'(\d\d)',item).group(0))
    elif 'advances to 2nd' in item:
        secondbaselist.append(re.search(r'(\d\d)',item).group(0))
    elif 'advances to 3rd' in item:
        thirdbaselist.append(re.search(r'(\d\d)',item).group(0))

print firstbaselist
print secondbaselist
print thirdbaselist

给出:

['48']
['43', '48']
['43']