将区分大小写的正则表达式和不区分大小写的正则表达式合并为一个

时间:2013-10-31 21:58:46

标签: python regex

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

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

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

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

谢谢,

尤利安

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

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

示例:

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

2 个答案:

答案 0 :(得分: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

显然,这种方法最适用于不敏感部分非常简短的事情,所以我担心它不适合你。

答案 1 :(得分:1)

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

要做到这一点,通常会成为一场噩梦。

仅为fnmatch结果执行此操作非常容易。

如果你需要处理完整的Unicode案例规则,它仍然会很难。

如果您只需要处理以确保每个字符c也匹配c.upper()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.*'。你可以通过使用替换来组合这些,因为你显然已经知道该怎么做了。