我试图迭代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")
等,没有任何变化。我错过了什么?
答案 0 :(得分:1)
错误是因为您使用的是re.match
而不是re.search
。 re.match
和re.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']