使用str.format()
是在Python 2.6和Python 3中格式化字符串的新标准。在将str.format()
与正则表达式一起使用时,我遇到了一个问题。
我已经编写了一个正则表达式来返回指定域下的单个级别的所有域或者指定域下2级的任何域,如果下面的第二级是www ...
假设指定的域名是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!
现在,问题是我尝试使用str.format动态替换delivery.com ...
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 + '$'
问题归结为,当字符串(通常是正则表达式)中包含“ {n} ”时,是否可以使用str.format()
?
答案 0 :(得分:25)
首先需要格式化字符串然后使用正则表达式。把所有东西都放在一条线上真的不值得。通过加倍花括号来完成转义:
>>> pat= '^(w{{3}}\.)?([0-9A-Za-z-]+\.)re.match
{domainName}$'.format(domainName = 'delivery.com')
>>> pat
'^(w{3}\\.)?([0-9A-Za-z-]+\\.){1}delivery.com$'
>>> re.match(pat, str1)
此外,^
在字符串的开头匹配,如果您使用re.match
,则无需放置^
,如果您需要re.search
但是,重新使用{1}
。
请注意,正则表达式中的{{1}}相当多余。
答案 1 :(得分:11)
根据the documentation,如果您需要文字{
或}
以便在格式化操作中继续存在,请在原始字符串中使用{{
和}}
。< / p>
'^(w{{3}}\.)?([0-9A-Za-z-]+\.){{1}}{domainName}$'.format(domainName = 'delivery.com')