Python 2.6+ str.format()和正则表达式
问题内容:
使用str.format()
是在Python 2.6和Python
3中格式化字符串的新标准。使用str.format()
正则表达式时遇到了一个问题。
我编写了一个正则表达式以返回位于指定域以下一个级别的所有域,或者返回位于指定域以下两个级别的所有域(如果以下第二个级别为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 + '$'
问题归结为,str.format()
当字符串(通常为正则表达式)中包含“ {n} ”时是否可以使用?
问题答案:
您首先需要格式化字符串,然后使用正则表达式。将所有内容放在一行中确实不值得。通过将花括号加倍来进行转义:
>>> 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.search
。
请注意,{1}
在正则表达式中是相当多余的。