带有正则表达式字符串的Python列表列表

时间:2018-11-12 16:20:08

标签: python regex list

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错误。我在做什么错了?

1 个答案:

答案 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)

其他提示:

  1. 将正则表达式更改为r'Block2:\s*(.*)'(我添加了\s*)。 这样,您可以避免每个Block2保留初始空间(如果有)。

  2. 不清楚,为什么要使用secondlist。 也许您应该将直接匹配的字符串添加到list1