#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[^{}] ?)}}'
Ответ №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’]