Python 2.6+ str.format () и регулярные выражения

Использование str.format() – новый стандарт для форматирования строк в Python 2.6 и Python 3. У меня возникла проблема при использовании str.format() с регулярными выражениями.

Я написал регулярное выражение, чтобы вернуть все домены, которые находятся на одном уровне ниже указанного домена или любых доменов, которые на 2 уровня ниже указанного домена, если на втором уровне ниже …

Предполагая, что указанным доменом является delivery.com, мое регулярное выражение должно возвращать a.delivery.com, b.delivery.com, www.c.delivery.com … но он не должен возвращать xadelivery.com.

 import re str1 = "www.pizza.delivery.com" str2 = "w.pizza.delivery.com" str3 = "pizza.delivery.com" if (re.match('^(w{3}\.)?([0-9A-Za-z-]+\.){1}delivery.com$', str1): print 'String 1 matches!' if (re.match('^(w{3}\.)?([0-9A-Za-z-]+\.){1}delivery.com$', str2): print 'String 2 matches!' if (re.match('^(w{3}\.)?([0-9A-Za-z-]+\.){1}delivery.com$', str3): print 'String 3 matches!' 

Выполнение этого должно дать результат:

 String 1 matches! String 3 matches! 

Теперь проблема заключается в том, что я пытаюсь заменить delivery.com динамически с помощью str.format …

 if (re.match('^(w{3}\.)?([0-9A-Za-z-]+\.){1}{domainName}$'.format(domainName = 'delivery.com'), str1): print 'String 1 matches!' 

Кажется, что это терпит неудачу, потому что str.format() ожидает, что {3} и {1} будут параметрами функции. (Я предполагаю, что)

Я мог бы конкатенировать строку с помощью оператора +

 '^(w{3}\.)?([0-9A-Za-z-]+\.){1}' + domainName + '$' 

Вопрос сводится к тому, можно ли использовать str.format() когда строка (обычно регулярное выражение) имеет « {n} » внутри нее?

2 Solutions collect form web for “Python 2.6+ str.format () и регулярные выражения”

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

 >>> pat= '^(w{{3}}\.)?([0-9A-Za-z-]+\.){{1}}{domainName}$'.format(domainName = 'delivery.com') >>> pat '^(w{3}\\.)?([0-9A-Za-z-]+\\.){1}delivery.com$' >>> re.match(pat, str1) . >>> pat= '^(w{{3}}\.)?([0-9A-Za-z-]+\.){{1}}{domainName}$'.format(domainName = 'delivery.com') >>> pat '^(w{3}\\.)?([0-9A-Za-z-]+\\.){1}delivery.com$' >>> re.match(pat, str1) 

Кроме того, re.match соответствует в начале строки, вам не нужно re.match ^ если вы используете re.match , вам нужно ^ если вы используете re.search .

Обратите внимание, что {1} в регулярном выражении довольно избыточно.

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

 '^(w{{3}}\.)?([0-9A-Za-z-]+\.){{1}}{domainName}$'.format(domainName = 'delivery.com') 
  • альтернатива strptime для сравнения дат?
  • Тонковый шаблон для n-грамма в TfidfVectorizer в python
  • Почему выражение регулярного выражения, содержащего «\», работает без того, чтобы оно являлось исходной строкой.
  • Правильное выражение Python 3 для поиска многострочного комментария
  • Регулярное выражение для удаления данных в скобках
  • python, регулярное выражение и специальный символ
  • Регулярное выражение Python, соответствующее свойствам Unicode
  • использование regex в jinja 2 для прослушиваемых книг
  • Python - лучший язык программирования в мире.