У меня есть файл HTML, в который я вставил пользовательские теги, например {{name}}
, {{surname}}
. Теперь я хочу найти теги, которые точно соответствуют шаблону, например {{world}}
, только не {world}}
, {{world}
, {world}
, { word }
, {{ world }}
и т.д. Я написал небольшой код для
re.findall(r'\{(\w.+?)\}', html_string)
Он возвращает слова, которые следуют шаблону {{world}}, {world}, {world}} что я не хочу. Я хочу точно сопоставить {{world}}. Кто-нибудь может направить меня?
Um, не должно быть регулярное выражение:
'\{\{(\w.+?)\}\}'
Хорошо, после комментариев, я больше понимаю ваши требования:
'\{\{\w+?\}\}'
должен работать на вас.
В принципе, вы хотите {{любое количество символов слова, включая символ подчеркивания}}. Вы даже не нуждаетесь в ленивом совпадении в этом случае, так что вы можете удалить th ?
в выражении.
Что-то вроде {{keyword1}} other stuff {{keyword2}}
теперь не будет соответствовать целиком.
Чтобы получить только ключевое слово, не используя {{}}, используйте ниже:
'(?<=\{\{)\w+?(?=\}\})'
Если вы хотите совместить скобки с двойными фигурами, вы должны указать их в своем регулярном выражении:
re.findall(r'\{\{(\w[^}]?)\}\}', html_string)
Вы говорите, что другие ответы не работают, но они кажутся мне:
>>> 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\+]
, чтобы также совместить знак плюса).
Как насчет этого?
re.findall('{{(\w+)}}', html_string)
Или, если вы хотите, чтобы фигурные фигурные скобки включались в результаты:
re.findall('({{\w+}})', html_string)
Если вы пытаетесь выполнить html-шаблонизацию, я рекомендую использовать хороший механизм шаблонов.
Это не будет соответствовать фигурным скобкам в вашем результате, вы хотите?
'\{\{(\w[^\{\}]+?)\}\}'