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

7 投票
3 回答
14766 浏览
提问于 2025-04-15 14:29

在Python中,有没有办法实现这样一个简单的功能:

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

字符串中间的标记字母总是大写的。而其他单词的字母可以是任意大小写(比如:USE、use、Use、CODE、code、Code等等)。

3 个回答

4

根据文档的说明,这个是做不到的。(?x)这种写法只能让你对整个表达式修改一个标志。所以,你必须把这个分成三个正则表达式,依次应用它们,或者手动处理“忽略大小写”的问题,比如用/[uU][sS][eE]...这样的方式。

14

从Python 3.6开始,你可以在正则表达式的分组中使用标志:

(?imsx-imsx:...)

这里的字母可以是'i'、'm'、's'、'x'中的任意组合,后面可以选择加上一个'-',再加上一个或多个同样的字母。这些字母用来设置或取消对应的标志:re.I(忽略大小写)、re.M(多行匹配)、re.S(点号匹配所有字符)和re.X(详细模式),适用于表达式的某一部分。

因此,(?i:use)现在是一个正确的语法。在Python 3.6的终端中:

>>> import re
>>> regex = re.compile('(?i:use)\s+([A-Z0-9]+)\s+(?i:code)')
>>> regex.match('Use HELLO1 code')
<_sre.SRE_Match object; span=(0, 15), match='Use HELLO1 code'>
>>> regex.match('use HELLO1 Code')
<_sre.SRE_Match object; span=(0, 15), match='use HELLO1 Code'>
9

根据我找到的信息,Python的正则表达式引擎不支持部分忽略大小写的功能。这里有一个解决方案,它使用了不区分大小写的正则表达式,然后再检查一下这个词是否是大写的。

#! /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

撰写回答