2016-10-17 3 views
1

После просмотра afewsimilarquestions, я не смог успешно реализовать подстроку, разделенную на мои данные. Для моего конкретного случая у меня есть куча строк, и каждая строка имеет подстроку, которую мне нужно извлечь. Строки группируются вместе в списке, а мои данные - позиции НБА. Мне нужно вытащить позиции («PG», «SG», «SF», «PF» или «C») из каждой строки. В некоторых строках будет несколько позиций. Вот данные.Поиск и извлечение нескольких подстрок в строке?

text = ['Chi\xa0SG, SF\xa0\xa0DTD','Cle\xa0PF'] 

Код должен идеально выглядеть на первой строке, 'Chi\xa0SG, SF\xa0\xa0DTD' и вернуть ['SG','SF'] две позиции. Код должен смотреть на вторую строку и возвращать ['PF'].

+1

Вы можете добавить полный ожидаемый результат для ясности? например: это то, что вы ищете? '[re.findall (r '\ b (PG | SG | SF | PF | C) \ b', s) для s в тексте]' – Sundeep

ответ

2

Плечо (нулевая ширина) lookarounds:

(?<!\w)PG|SG|SF|PF|C(?!\w) 
  • (?<!\w) равна нулю ширины отрицательной модели просмотра назад, убедившись, что желаемый матч не предшествует ни буквенно-цифровых символов

  • PG|SG|SF|PF|C соответствует любому из желательные рисунки

  • (?!\w) is zero width negative looka рисунок головы убедившись, что матч не последовало никаких букв и цифр

Пример: ответ

In [7]: s = 'Chi\xa0SG, SF\xa0\xa0DTD' 

In [8]: re.findall(r'(?<!\w)PG|SG|SF|PF|C(?!\w)', s) 
Out[8]: ['SG', 'SF'] 
+0

Почему бы не использовать границу слова? 'r '\ b (PG | SG | SF | PF | C) \ b'' – Sundeep

0

heemayl является наиболее правильным, но вы могли бы, вероятно, уйти с расщеплением на запятых и сохраняя только последние два (или в случае «C», последние) символы в каждой подстроке.

s = 'Chi\xa0SG, SF\xa0\xa0DTD' 
fin = list(map(lambda x: x[-2:] if x != 'C' else x[-1:],s.split(','))) 

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

+0

Почему бы не создать резервную копию своей идеи с кодом? – Sundeep

+0

У меня сейчас нет возможности проверить его, но я все равно дал ему –