python повторно выполняет поиск (регулярное выражение) для поиска слов, которые имеют шаблон, подобный только {{world}}

#python #regex #matching

#python #регулярное выражение #соответствие

Вопрос:

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

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

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

Ответ №1:

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

 '{{(w. ?)}}'
  

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

 '{{w ?}}'
  

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

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

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

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

 '(?<={{)w ?(?=}})'
  

Комментарии:

1. нет, это также будет соответствовать шаблону {word}} {{word}, подобному этому …:(

2. Как это будет соответствовать? Обратите внимание на явные две фигурные скобки в регулярном выражении

3. он должен точно соответствовать шаблону {{world}}, только такому

4. q = ‘html>n <head> n </head>n <title>n </title>n <body> n <h1>n Футболки n </h1> n <img src=»Tshirts/skull_headphones_tshirt.jpg » />n <img src=»shirts/star-wars-t-shirts-6.jpeg » />n <h2>n мы — мы — мы n </h2>n {{отписаться}} — {{tracking_beacon} — {web_url}} — {name} n </body>n</html>n’

5. Вы пробовали вышеупомянутый шаблон, который я привел в вашем коде?

Ответ №2:

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

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

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

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

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

Ответ №3:

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

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

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

Ответ №4:

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

 re.findall(r'{{(w[^}]?)}}', html_string)
  

Комментарии:

1. это также будет соответствовать шаблону, подобному {word}} {{world}, который не должен совпадать

2. Смотрите мою правку. В этом случае вы должны указать «not }» вместо использования простой точки.

3. Ахим, вам понадобится какой-то квантификатор в вашем регулярном выражении, поскольку в настоящее время он будет соответствовать только одному символу слова и необязательному символу, который не является ‘}’, между двойными фигурными скобками.

Ответ №5:

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

 >>> 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 - Shirtsn </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 - wen </h2>n {{unsubscribe}} -- {{tracking_beacon} -- {web_url}} -- {name} n </body>n</html>n'
>>> re.findall(r'{{(w )}}', html_string)
['unsubscribe']
  

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

Комментарии:

1. Вы правы, это работает для вашего примера, но когда я попытался, например: 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-wars-t-shirts-6.jpeg » />n <h2>n мы — мы — мы n </h2>n {{отписаться}} — {{tracking_beacon} — {web_url}} — {name} n </body> n</html>n’ это дает результат: [‘отписаться’, ‘tracking_beacon} — {web_url’]