python re.search (regex) для поиска слов с шаблоном типа {{world}} - PullRequest
1 голос
/ 29 апреля 2011

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

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

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

Ответы [ 5 ]

5 голосов
/ 29 апреля 2011

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

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

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

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

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

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

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

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

'(?<=\{\{)\w+?(?=\}\})'
2 голосов
/ 29 апреля 2011

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

>>> 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\+], чтобы также соответствовать знаку плюса).

2 голосов
/ 29 апреля 2011

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

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

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

2 голосов
/ 29 апреля 2011

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

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

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

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

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

2 голосов
/ 29 апреля 2011

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

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