在Python中,是否有更好的方法将字符串参数化为正则表达式,而不是像这样手动执行:
test = 'flobalob' names = ['a', 'b', 'c'] for name in names: regexp = "%s" % (name) print regexp, re.search(regexp, test)
这个noddy示例尝试依次匹配每个名称.我知道有更好的方法可以做到这一点,但这只是一个简单的例子,纯粹是为了说明这一点.
答案似乎是否定的,没有真正的选择.在python中对正则表达式进行参数化的最佳方法如上所述,或者使用衍生函数str.format()
.我试着写一个通用的问题,而不是'修复ma codez,kthxbye'.对于那些仍然感兴趣的人,我已经充实了一个更贴近我需求的例子:
for diskfilename in os.listdir(''): filenames = ['bob.txt', 'fred.txt', 'paul.txt'] for filename in filenames: name, ext = filename.split('.') regexp = "%s.*\.%s" % (name, ext) m = re.search(regexp, diskfilename) if m: print diskfilename, regexp, re.search(regexp, diskfilename) # ...
我试图根据文件的文件名找出文件的"类型"
.在我的真实代码中,filenames
数组是一个dict,包含一个匹配的函数.
我考虑过的其他方式:
在数组中有一个正则表达式.我已经有一个没有任何正则表达式魔法的文件名数组,所以我不喜欢这样做.我已经在我的代码中的其他地方完成了这个并且它是一团糟(尽管有必要).
仅匹配文件名的开头.这可行,但会打破文件的.bak副本等.在某些时候我可能想从文件名中提取日期,所以无论如何都需要使用正则表达式.
感谢响应建议正则表达式的替代方法,以实现相同的最终结果.我对现在和未来的正则表达式参数化更感兴趣.我从未遇到过fnmatch,所以从长远来看它都很有用.
好吧,当你从字符串构建一个正则表达式时,我没有别的办法.但您可以使用字典对字符串本身进行参数化:
d = {'bar': 'a', 'foo': 'b'} regexp = '%(foo)s|%(bar)s' % d
或者,根据问题,您可以使用列表推导:
vlist = ['a', 'b', 'c'] regexp = '|'.join([s for s in vlist])
编辑: Mat澄清了他的问题,这使事情变得不同,上面提到的完全无关紧要.
我可能会采用这样的方法:
filename = 'bob_20090216.txt' regexps = {'bob': 'bob_[0-9]+.txt', 'fred': 'fred_[0-9]+.txt', 'paul': 'paul_[0-9]+.txt'} for filetype, regexp in regexps.items(): m = re.match(regexp, filename) if m != None: print '%s is of type %s' % (filename, filetype)