【发布时间】:2010-10-07 23:38:09
【问题描述】:
在 Python 中,有没有更好的方法来将字符串参数化为正则表达式,而不是像这样手动进行:
test = 'flobalob'
names = ['a', 'b', 'c']
for name in names:
regexp = "%s" % (name)
print regexp, re.search(regexp, test)
这个点头的例子试图依次匹配每个名字。我知道有更好的方法可以做到这一点,但它只是一个简单的例子来说明这一点。
答案似乎是否定的,没有真正的选择。在 python 中参数化正则表达式的最佳方法是如上所述或使用诸如str.format() 之类的衍生物。我尝试编写一个通用问题,而不是 'fix 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)
# ...
我正在尝试根据文件名确定文件的“类型”,格式为<filename>_<date>.<extension>。在我的真实代码中,filenames 数组是一个字典,包含一个找到匹配项后调用的函数。
我考虑过的其他方式:
在数组中有一个正则表达式。我已经有一个没有任何正则表达式魔法的文件名数组,所以我不愿意这样做。我在我的代码中的其他地方做了这个,它一团糟(尽管在那里是必要的)。
仅匹配文件名的开头。这可行,但会与文件的 .bak 副本等中断。在某些时候,我可能想要提取日期来自文件名,所以无论如何都需要使用正则表达式。
感谢您的回复,建议使用正则表达式的替代方法来实现相同的最终结果。我对现在和未来的正则表达式参数化更感兴趣。我从来没有遇到过 fnmatch,所以从长远来看它都是有用的。
【问题讨论】:
-
如果您就具体案例提出问题,您可能会得到更好的答案。
-
在知道参数化正则表达式之后,我更多的是比修复我的作业,kthxbye。见上文。
-
我只有一个你可能已经知道的评论,但我想确定一下——当一遍又一遍地使用相同的正则表达式时,如果你先编译它们,你会看到更好的性能: p = re.compile(s) 您的示例(以及响应中的其他示例)不这样做。