如何在Python中为部分正则表达式设置ignorecase标志?

时间:2009-09-21 15:35:55

标签: python regex

是否可以在Python中实现类似这样简单的东西:

#!/usr/bin/perl
my $a = 'Use HELLO1 code';
if($a =~ /(?i:use)\s+([A-Z0-9]+)\s+(?i:code)/){
    print "$1\n";
}

字符串中间的标记字母始终是大写字母。其余单词的字母可以有任何情况(使用,使用,使用,代码,代码,代码等)

3 个答案:

答案 0 :(得分:10)

据我所知,python正则表达式引擎不支持部分ignore-case。这是一个使用不区分大小写的正则表达式的解决方案,然后测试该标记后面是否为大写。

#! /usr/bin/env python

import re

token_re = re.compile(r'use\s+([a-z0-9]+)\s+code', re.IGNORECASE)
def find_token(s):
    m = token_re.search(s)
    if m is not None:
        token = m.group(1)
        if token.isupper():
            return token

if __name__ == '__main__':
    for s in ['Use HELLO1 code',
              'USE hello1 CODE',
              'this does not match',
             ]:
        print s, '->',
        print find_token(s)

这是程序的输出:

Use HELLO1 code -> HELLO1
USE hello1 CODE -> None
this does not match -> None

答案 1 :(得分:3)

According to the docs,这是不可能的。 (?x)语法仅允许您修改整个表达式的标志。因此,您必须将其拆分为三个正则表达式并一个接一个地应用它们手动执行“忽略大小写”:/[uU][sS][eE]...

答案 2 :(得分:3)

从python 3.6开始,您可以在组内使用标志:

  

(imsx-imsx:?...)

     

(来自集合'i','m','s','x'的零个或多个字母,可选地后跟' - '后跟来自同一集合的一个或多个字母。)字母设置或删除相应的标志:re.I(忽略大小写),re.M(多行),re.S(点匹配所有)和re.X(详细),表达式的一部分。

因此[{ "$type": "Base", "Name": "Base" }, { "$type": "Derived1", "Value": 3, "Name": "Derived1" }, { "$type": "Derived2", "Value": true, "Name": "Derived2" } ] 现在是正确的语法。来自python3.6终端:

(?i:use)