python re.search (regex) для поиска слов с шаблоном типа {{world}}

1

У меня есть файл HTML, в который я вставил пользовательские теги, например {{name}}, {{surname}}. Теперь я хочу найти теги, которые точно соответствуют шаблону, например {{world}}, только не {world}}, {{world}, {world}, { word }, {{ world }} и т.д. Я написал небольшой код для

re.findall(r'\{(\w.+?)\}', html_string)

Он возвращает слова, которые следуют шаблону {{world}}, {world}, {world}} что я не хочу. Я хочу точно сопоставить {{world}}. Кто-нибудь может направить меня?

Теги:
matching

5 ответов

5
Лучший ответ

Um, не должно быть регулярное выражение:

'\{\{(\w.+?)\}\}'

Хорошо, после комментариев, я больше понимаю ваши требования:

'\{\{\w+?\}\}'

должен работать на вас.

В принципе, вы хотите {{любое количество символов слова, включая символ подчеркивания}}. Вы даже не нуждаетесь в ленивом совпадении в этом случае, так что вы можете удалить th ? в выражении.

Что-то вроде {{keyword1}} other stuff {{keyword2}} теперь не будет соответствовать целиком.

Чтобы получить только ключевое слово, не используя {{}}, используйте ниже:

'(?<=\{\{)\w+?(?=\}\})'
  • 0
    нет, это также будет соответствовать шаблону {word}} {{word} вот так ... :(
  • 0
    Как это будет соответствовать? Обратите внимание на явные две фигурные скобки в регулярном выражении
Показать ещё 14 комментариев
2

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

re.findall(r'\{\{(\w[^}]?)\}\}', html_string)
  • 0
    это также будет соответствовать шаблону как {слово}} {{мир} как то, что не должно соответствовать
  • 0
    Смотрите мое редактирование. В этом случае вы должны указать «not}» вместо использования простой точки.
Показать ещё 1 комментарий
2

Вы говорите, что другие ответы не работают, но они кажутся мне:

>>> import re
>>> html_string = '{{realword}} {fake1}} {{fake2} {fake3} fake4'
>>> re.findall(r'\{\{(\w.+?)\}\}', html_string)
['realword']

Если вам это не сработает, вам нужно будет предоставить более подробную информацию.

Изменить: как насчет следующего? Избавление от точки (.) и использование только \w также позволяет использовать жадные квалификаторы и работает для примера HTML из вашего комментария:

>>> html_string = 'html>\n <head>\n </head>\n <title>\n </title>\n <body>\n <h1>\n T - Shirts\n </h1>\n <img src="March-Tshirts/skull_headphones_tshirt.jpg" />\n <img src="/March-Tshirts/star-wars-t-shirts-6.jpeg" />\n <h2>\n we - we - we\n </h2>\n {{unsubscribe}} -- {{tracking_beacon} -- {web_url}} -- {name} \n </body>\n</html>\n'
>>> re.findall(r'\{\{(\w+)\}\}', html_string)
['unsubscribe']

\w соответствует буквенно-цифровым символам и подчеркиванию; если вам нужно сопоставить больше символов, вы можете добавить их в набор (например, [\w\+], чтобы также совместить знак плюса).

  • 0
    Вы правы, это работает для вашего примера, но когда я попробовал, например: html_string = 'html> \ n <head> \ n </ head> \ n <title> \ n </ title> \ n <body> \ n <h1> \ n Футболки \ n </ h1> \ n <img src = "March-Tshirts / skull_headphones_tshirt.jpg" /> \ n <img src = "/ March-Tshirts / star-war-t-shirts -6.jpeg "/> \ n <h2> \ n мы - мы - мы \ мы <мы h>> \ n {{unsubscribe}} - {{tracking_beacon} - {web_url}} - {имя} \ n </ body> \ n </ html> \ n 'это дает результат: [' unsubscribe ',' tracking_beacon} - {web_url ']
  • 0
    Хорошо, обновлено, чтобы оно работало с этим примером.
2

Как насчет этого?

re.findall('{{(\w+)}}', html_string)

Или, если вы хотите, чтобы фигурные фигурные скобки включались в результаты:

re.findall('({{\w+}})', html_string)

Если вы пытаетесь выполнить html-шаблонизацию, я рекомендую использовать хороший механизм шаблонов.

  • 0
    Это работает ... именно я хочу.
2

Это не будет соответствовать фигурным скобкам в вашем результате, вы хотите?

'\{\{(\w[^\{\}]+?)\}\}'

http://rubular.com/r/79YwR13MS0

  • 0
    это работает .... спасибо большое.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню