Python список списков со строками с регулярным выражением - PullRequest
0 голосов
/ 12 ноября 2018

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 голосов
/ 12 ноября 2018

Источник вашей проблемы - строка:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...