当前位置:  开发笔记 > 编程语言 > 正文

Python中的参数化正则表达式

如何解决《Python中的参数化正则表达式》经验,为你挑选了1个好方法。

在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,所以从长远来看它都很有用.



1> paprika..:

好吧,当你从字符串构建一个正则表达式时,我没有别的办法.但您可以使用字典对字符串本身进行参数化:

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)

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有