如何在Python中为正则表达式的一部分设置忽略大小写标志?

7

在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个回答

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'>

在早期版本中,您可以使用 regex 模块,它是 re 的替代品。 - Endre Both
你在哪里看到 (?imsx-imsx:...) 的文档?我只在 help(re) 中看到 (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below) - Shuzheng
...并且上述内容应当仅用于正则表达式的开头。 - Shuzheng
@Shuzheng https://docs.python.org/3.6/library/re.html - Thomas Perrot

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

1
“match” 显然不是正确的方法 - 如果您切换到“search”,由于您不会循环查找“下一个可能的候选项”,因此您的“find_token”将给出错误的负面结果(如果“包括大小写”的实例之前有一个“除了大小写好”的实例)。 - Alex Martelli
@Alex Martelli:谢谢。搜索更好,你是对的。已修复。 - Christian Oudard

4
根据文档,这是不可能的。 (?x) 语法只允许您修改整个表达式的标志。因此,您必须将其拆分为三个正则表达式,并依次应用它们,或者手动执行“忽略大小写”:/[uU][sS][eE]...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接