2

我有多个文件过滤器(我正在使用 python)。其中一些是glob 过滤器,其中一些是正则表达式。我有区分大小写和不区分大小写的全局和正则表达式。我可以使用translate将 glob 转换为正则表达式。

我可以将区分大小写的正则表达式组合成一个大的正则表达式。我们称它为 R_sensitive。

我可以将不区分大小写的正则表达式组合成一个大的正则表达式(不区分大小写)。我们称它为 R_insensitive。

有没有办法将 R_insensitive 和 R_sensitive 组合成一个正则表达式?该表达式(当然)区分大小写?

谢谢,

尤利安

注意:我组合表达式的方式如下:

拥有 R1,R2,R3 正则表达式,我使 R = (R1)|(R2)|(R3)。

例子:

我正在搜索“*.txt”(不敏感的 glob)。但我有另一个像这样的 glob:“*abc*”(区分大小写)。当一个不区分大小写而另一个区分大小写时,如何组合(通过编程)由“fnmatch.translate”产生的2个正则表达式?

4

2 回答 2

2

不幸的是,您描述的正则表达式能力是序数修饰符或修饰符跨度。Python 也不支持,尽管它们看起来像这样:

序数修饰符:(?i)case_insensitive_match(?-i)case_sensitive_match

修改器跨度:(?i:case_insensitive_match)(?-i:case_sensitive_match)

在 Python 中,它们都无法解析re. 您可以做的最接近的事情(对于简单或小型匹配)将是字母组:

[Cc][Aa][Ss][Ee]_[Ii][Nn][Ss][Ee][Nn][Ss][Ii][Tt][Ii][Vv][Ee]_[Mm][Aa][Tt][Cc][Hh]case_sensitive_match

显然,这种方法最适合不敏感部分非常简短的东西,所以恐怕它不是你的最佳选择。

于 2013-10-31T22:46:19.297 回答
1

您需要一种将不区分大小写标志的正则表达式转换为在没有标志的情况下等效的正则表达式的方法。

一般来说,要完全做到这一点将是一场噩梦。

仅仅为了fnmatch结果而这样做要容易得多。

如果您需要处理完整的 Unicode 大小写规则,仍然会非常困难。

如果您只需要确保每个字符c也匹配c.upper()and c.lower(),这很容易。

我只解释简单的情况,因为它可能是你想要的,给定你的例子,而且很简单。:)

Python 标准库中的一些模块旨在用作示例代码以及工作实现;这些模块的文档以直接指向其源代码的链接开始。并且fnmatch有这样的链接。

如果您了解 regexp 语法和 glob 语法,并查看函数的源代码translate,那么编写自己的函数应该很容易translatenocase

基本上:在else用于构建字符类的内部子句中,遍历字符,并且对于每个字符,if c.upper() != c.lower()都追加而不是c. else然后,在非特殊字符的外部子句中if c.upper() != c.lower(),附加一个由这两个字符组成的两字符字符类。

因此,translatenocase('*.txt')将返回类似r'.*\.[tT][xX][tT]'的东西而不是类似的东西r'.*\.txt'。但正常translate('*abc*')当然会恢复正常r'.*abc.*'。你可以通过使用交替组合这些,因为你显然已经知道该怎么做。

于 2013-10-31T22:20:49.630 回答