Подтвердить что ты не робот

Peyon regex findall

Я пытаюсь извлечь все вхождения помеченных слов из строки с использованием regex в Python 2.7.2. Или просто, я хочу извлечь каждую часть текста внутри тегов [p][/p]. Вот моя попытка:

regex = ur"[\u005B1P\u005D.+?\u005B\u002FP\u005D]+?"
line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday."
person = re.findall(pattern, line)

Печать person создает ['President [P]', '[/P]', '[P] Bill Gates [/P]']

Какое правильное регулярное выражение получится: ['[P] Barack Obama [/P]', '[P] Bill Gates [/p]'] или ['Barrack Obama', 'Bill Gates'].

Спасибо.:)

4b9b3361

Ответ 1

import re
regex = ur"\[P\] (.+?) \[/P\]+?"
line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday."
person = re.findall(regex, line)
print(person)

дает

['Barack Obama', 'Bill Gates']

Регулярное выражение ur"[\u005B1P\u005D.+?\u005B\u002FP\u005D]+?" точно такое же unicode как u'[[1P].+?[/P]]+?', за исключением более трудного для чтения.

Первая группа в скобках [[1P] сообщает re, что любой из символы в списке ['[', '1', 'P'] должны совпадать и аналогично со второй группой [/P]]. Это не то, что вы хотите вообще. Таким образом,

  • Снимите внешние квадратные скобки. (Также удалите блуждающий 1 перед P.)
  • Чтобы защитить литеральные скобки в [P], уберите скобки с помощью обратная косая черта: \[P\].
  • Чтобы вернуть только те слова внутри тегов, скопируйте скобки вокруг .+?.

Ответ 2

Попробуйте следующее:

   for match in re.finditer(r"\[P[^\]]*\](.*?)\[/P\]", subject):
        # match start: match.start()
        # match end (exclusive): match.end()
        # matched text: match.group()

Ответ 3

Ваш вопрос не на 100% ясен, но я предполагаю, что вы хотите найти каждый фрагмент текста внутри тегов [P][/P]:

>>> import re
>>> line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday."
>>> re.findall('\[P\]\s?(.+?)\s?\[\/P\]', line)
['Barack Obama', 'Bill Gates']

Ответ 4

вы можете заменить свой шаблон

regex = ur"\[P\]([\w\s]+)\[\/P\]"

Ответ 5

Используйте этот шаблон,

pattern = '\[P\].+?\[\/P\]'

Отметьте здесь