segmented
是一个列表列表。每个元素可以是一个或多个字符串元素的列表。每个字符串元素的形式为:
Block1: some strings
Block2: some strings
现在,并非所有的字符串元素都必须具有Block2
。
我想运行一个循环,在该循环中选择“分段”中的每个元素,然后与辅助元素进行进一步循环并测试Block2
。如果存在,则选择Block2
之后的字符串。如果辅助元素多于1个,则所有字符串都将合并为一个字符串。我尝试的代码如下
blk2 = re.compile(r'Block2:(.*)', re.DOTALL)
list1 = []
for i in segmented:
secondlist = []
for j in i:
if re.search(blk2, j).group(1) is not None: # testing if Block2 exists
txt = re.search(blk2, j).group(1) # picking up strings after Block2.
secondlist.append(txt) #appending the string to an intermediate list
'\n'.join(secondlist) #if there are more than 1 element in secondlist joining them to one element
list1.append(secondlist[0]) # appending the joined element to list1
我一直遇到NoneType
错误。我在做什么错了?
答案 0 :(得分:0)
问题的根源是行:
if re.search(blk2, j).group(1) is not None:
当j
仅包含Block1
(不包含Block2
)时,此代码将失败。
在这种情况下,search
不匹配任何内容,因此search
的结果
是None
。
然后,在None
对象(类型为NoneType
)上,您尝试调用group(1)
会引发异常AttributeError: 'NoneType' object has no attribute 'group'
。
另一句话:您不必像以前一样打两次search
。
因此将此片段更改为:
m = re.search(blk2, j)
if m:
txt = m.group(1)
其他提示:
将正则表达式更改为r'Block2:\s*(.*)'
(我添加了\s*
)。
这样,您可以避免每个Block2
保留初始空间(如果有)。
不清楚,为什么要使用secondlist
。
也许您应该将直接匹配的字符串添加到list1
。