在Python中,是否有更好的方法将字符串参数化为正则表达式,而不是像这样手动执行:
test = 'flobalob'
names = ['a', 'b', 'c']
for name in names:
regexp = "%s" % (name)
print regexp, re.search(regexp, test)
Run Code Online (Sandbox Code Playgroud)
这个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)
# ...
Run Code Online (Sandbox Code Playgroud)
我试图根据文件的文件名找出文件的"类型" <filename>_<date>.<extension>.在我的真实代码中,filenames数组是一个dict,包含一个匹配的函数.
我考虑过的其他方式:
在数组中有一个正则表达式.我已经有一个没有任何正则表达式魔法的文件名数组,所以我不喜欢这样做.我已经在我的代码中的其他地方完成了这个并且它是一团糟(尽管有必要).
仅匹配文件名的开头.这可行,但会打破文件的.bak副本等.在某些时候我可能想从文件名中提取日期,所以无论如何都需要使用正则表达式.
感谢响应建议正则表达式的替代方法,以实现相同的最终结果.我对现在和未来的正则表达式参数化更感兴趣.我从未遇到过fnmatch,所以从长远来看它都很有用.
好吧,当你从字符串构建一个正则表达式时,我没有别的办法.但您可以使用字典对字符串本身进行参数化:
d = {'bar': 'a', 'foo': 'b'}
regexp = '%(foo)s|%(bar)s' % d
Run Code Online (Sandbox Code Playgroud)
或者,根据问题,您可以使用列表推导:
vlist = ['a', 'b', 'c']
regexp = '|'.join([s for s in vlist])
Run Code Online (Sandbox Code Playgroud)
编辑: 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)
Run Code Online (Sandbox Code Playgroud)