首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python:将格式字符串转换为正则表达式

Python:将格式字符串转换为正则表达式
EN

Stack Overflow用户
提问于 2010-04-16 17:07:14
回答 2查看 5.9K关注 0票数 7

我的应用程序的用户可以通过一个格式字符串配置特定文件的布局。

例如,用户指定的配置值可能是:

代码语言:javascript
代码运行次数:0
运行
复制
layout = '%(group)s/foo-%(locale)s/file.txt'

我现在需要找到已经存在的所有这样的文件。使用glob模块似乎很容易:

代码语言:javascript
代码运行次数:0
运行
复制
glob_pattern = layout % {'group': '*', 'locale': '*'}
glob.glob(glob_pattern)

然而,现在出现了困难的部分:给定glob结果列表,我需要获得所有这些文件名--与给定占位符匹配的部分,例如,所有不同的"locale“值。

我想我应该为格式字符串生成一个正则表达式,然后我可以将其与glob结果列表相匹配(或者可能跳过glob并自己进行所有匹配)。

但是,我找不到一种很好的方法来创建正则表达式,既包含适当的组捕获,又能转义其余的输入。

例如,这可能给我一个与区域设置相匹配的正则表达式:

代码语言:javascript
代码运行次数:0
运行
复制
regex = layout % {'group': '.*', 'locale': (.*)}

但是要确定regex是有效的,我需要通过re.escape()传递它,然后它也会转义我刚才插入的regex语法。调用re.escape()首先会破坏格式字符串。

我知道有fnmatch.translate(),它甚至会给我一个正则表达式,但不是返回适当组的正则表达式。

有没有一个很好的方法来做到这一点,而不像用正则表达式安全的唯一值替换占位符之类的黑客呢?

有没有什么办法(也许是第三方图书馆?)它允许以更灵活的方式剖析格式字符串,例如在占位符位置拆分字符串?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-16 17:46:56

由于您使用的是命名占位符,所以我将使用命名组。这似乎是可行的:

代码语言:javascript
代码运行次数:0
运行
复制
import re
UNIQ='_UNIQUE_STRING_'
class MarkPlaceholders(dict):
    def __getitem__(self, key):
        return UNIQ+('(?P<%s>.*?)'%key)+UNIQ

def format_to_re(format):
    parts = (format % MarkPlaceholders()).split(UNIQ)
    for i in range(0, len(parts), 2):
        parts[i] = re.escape(parts[i])
    return ''.join(parts)

然后测试:

代码语言:javascript
代码运行次数:0
运行
复制
>>> layout = '%(group)s/foo-%(locale)s/file.txt'
>>> print format_to_re(layout)
(?P<group>.*?)\/foo\-(?P<locale>.*?)\/file\.txt
>>> pattern = re.compile(format_to_re(layout))
>>> print pattern.match('something/foo-en-gb/file.txt').groupdict()
{'locale': 'en-gb', 'group': 'something'}
票数 2
EN

Stack Overflow用户

发布于 2010-04-16 17:15:54

你可以试试这个,它可以解决你逃避的问题。

代码语言:javascript
代码运行次数:0
运行
复制
unique = '_UNIQUE_STRING_'
assert unique not in layout
regexp = re.escape(layout % {'group': unique, 'locale': unique}).replace(unique, '(.*)')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2654856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档