2014-11-25 9 views
-2

Если у меня есть строка, которая может выглядеть следующим образом:Извлечь текст между двойными квадратными скобками в Python

"[[Category:Political culture]]\n\n   [[Category:Political ideologies]]\n\n" 

Как извлечь категории и поместить их в список? Мне нелегко заставить регулярное выражение работать.

+1

Что у вас есть? – AndersNS

ответ

1

Похоже, вы хотите что-то вроде этого,

>>> str = "[[Category:Political culture]]\n\n   [[Category:Political ideologies]]\n\n" 
>>> re.findall(r'Category:([^\[\]]*)', str) 
['Political culture', 'Political ideologies'] 
>>> re.findall(r'Category:[^\[\]]*', str) 
['Category:Political culture', 'Category:Political ideologies'] 

По умолчанию re.findall будет печатать только строки, которые подбираются в настоящее время шаблон внутри захвата группы. Если группа захвата не присутствовала, то только функция findall вернет совпадения в списке. Поэтому в нашем случае это Category: соответствует строке category:, и этот ([^\[\]]*) будет захватывать любой символ, но не [ или ] ноль или более раз. Теперь FindAll функция возвратит символы, которые присутствуют внутри индекса группы 1.

+0

Это сработало отлично.У меня есть вопрос: почему «Категория» перед квадратными скобками? Разве это не должно появляться между ними? –

+0

Можете ли вы привести пример, который воспроизводит выше? –

+0

Нет, это работает, я просто имел в виду: Не могли бы вы объяснить мне регулярное выражение, потому что я действительно не понимаю, как это работает :) –

0

код Python:

s = "[[Category:Political culture]]\n\n   [[Category:Political ideologies]]\n\n" 
cats = [line.strip().strip("[").strip("]") for line in s.splitlines() if line] 
print(cats) 

Выход:

['Category:Political culture', 'Category:Political ideologies'] 
2

Чтобы расширить объяснения регулярных выражений, используемых Авинаш в своем answer:

Category:([^\[\]]*) состоит из нескольких частей:

  • Category:, который совпадает с текстом «Категория:»
  • (...) является захват группы означает примерно «выражение внутри этой группы представляет собой блок, который я хочу, чтобы извлечь»
  • [^...] является инвертированный множество, которое означает «делать не соответствуют никаким символам в этом наборе ».
  • \[ и \] соответствуют "[" и "]" в тексте соответственно.
  • * означает «матч ноль или более из предшествующих регулярных выражений определены элементы»

Где я использовал ..., чтобы указать, что я удалил некоторые символы, которые не были важны для объяснения.

Так положить все это вместе, регулярное выражение делает это:

Находки «Категория:», а затем совпадает с любым количеством (включая ноль) символов после этого, не исключенные символы «[» или «]». Когда он попадает в исключенный символ, он останавливается, и текст, соответствующий регулярному выражению внутри части (...), возвращается. Поэтому регулярное выражение фактически не ищет "[[" или "]]", как вы могли ожидать, и поэтому будет соответствовать, даже если они не учтены. Вы можете заставить его искать двойные квадратные скобки в начале и конце, изменив его на \[\[Category:([^\[\]]*)\]\].

Для второго регулярного выражения Category:[^\[\]]* группа захвата (...) исключена, поэтому Python возвращает все, что соответствует «Category:».

Смежные вопросы