2015-03-14 7 views
1

У меня есть этот список строк в Python 2.7:Регулярное выражение, чтобы вытащить переменную строку

list_a = ['temp_52_head sensor, 
uploaded by TS','crack in the left quadrant, uploaded by AB, Left in 2hr 
sunlight','FSL_pressure, uploaded by RS, no reported vacuum','art 
9943_mercury, Uploaded by DY, accelerated, hurst potential too 
low','uploaded by KKP, Space 55','avogadro reading level, 
uploaded by HB, started mini counter, pulled lever','no comment 
yesterday, Uploaded to TFG, level 1 escape but temperature stable, 
pressure lever north'] 

В каждом элементе списка, есть строка

uploaded by SOMEONE 

Мне нужно извлечь SOMEONE.

Однако, как вы можете видеть, SOMEONE:

  1. изменяется от одного пункта в списке к следующему.
  2. может быть длиной 2 или 3 символа (только текст, без цифр).
  3. происходит в разных положениях строки.
  4. закачано происходит также Загружено
  5. закачано иногда происходит перед любой запятой

Вот что мне нужно вытащить:

someone_names = ['TS','AB','RS','DY','KKP','HB','TFG'] 

Я думал об использовании регулярных выражений, но проблемы Я столкнулся с пунктами 2. и 3. выше.

Есть ли способ вытащить эти символы из списка?

ответ

4

Вы можете реализовать регулярное выражение, используя понимание списка.

>>> import re 
>>> list_a = [ 
     'temp_52_head sensor, uploaded by TS', 
     'crack in the left quadrant, uploaded by AB, Left in 2hr sunlight', 
     'FSL_pressure, uploaded by RS, no reported vacuum', 
     'art9943_mercury, Uploaded by DY, accelerated, hurst potential too low', 
     'uploaded by KKP, Space 55', 
     'avogadro reading level, uploaded by HB, started mini counter, pulled lever', 
     'no comment yesterday, Uploaded to TFG, level 1 escape but temperature stable,pressure lever north' 
] 
>>> regex = re.compile(r'(?i)\buploaded\s*(?:by|to)\s*([a-z]{2,3})') 
>>> names = [m.group(1) for x in list_a for m in [regex.search(x)] if m] 
['TS', 'AB', 'RS', 'DY', 'KKP', 'HB', 'TFG'] 
+0

Привет, это работает, но у меня есть минимальный опыт работы с 're.compile()' Не могли бы вы объяснить эти две строки, в частности первую? –

+0

Посмотрите на https://docs.python.org/2/library/re.html#re.compile – hwnd

+0

У меня есть последний вопрос: этот метод работает, даже если я использую '[az]' вместо '[AZ ] '. Почему вы использовали прописные буквы для алфавитов? –

0

Это выглядит как регулярное выражение, например, как это будет соответствовать вашим требованиям, если я что-то не хватает:

/[U|u]ploaded by ([A-Z]{2}|[A-Z]{3}),/ 

В качестве альтернативы, он появляется (из вашего образца), что вы могли бы разделить строку через запятые и вытащите элемент из массива, который имеет строку «загруженный» (избегает возможности верхнего/нижнего «u»), разбивает ее на пробелы, а затем берет последний элемент в результирующем массиве.

1

не регулярное выражение, но более подробный подход мог бы быть таким:

import re 
name = re.search(re.escape("uploaded by ")+"(.*?)"+re.escape(","),list_a[x]).group(1) 
+0

^^^^^ Я получаю это сообщение об ошибке 'TypeError: индексы списка должны быть целыми, а не str'. –

0

Это регулярное выражение ударит все тех, и если вы изменили, сколько писем были в добавивших таких инициалах, он будет работать. Это будет соответствовать независимо от того, есть ли запятая или одна цитата после двух или трех букв. Он будет также захватить все данные, которые вы ищете:

import re 

m = re.compile('uploaded ((by)|(to)) ([a-z]+)', flags=re.IGNORCASE) 

Вы можете использовать объект поиска скороговорки m с функцией search() и вытащит все матчи. 4-й матч на каждой итерации - это данные, которые вы ищете.

+0

Привет, это похоже на самый простой ответ, но 're.IGNORECASE' говорит, что' module object не имеет атрибута IGNORECASE'. Это не работает для Python 2.7? –

+0

Ах, ему нужны 'flags ='. починил это. – Beartech

+0

Я едва знаю Python, но мне интересно, можете ли вы просто присоединиться к вашему массиву строк в одну длинную строку, вызвать на нем функцию 'search()' и использовать функцию '.group'. Я считаю, что это будет в группе (4) – Beartech