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

0ve6wy6x  于 2023-03-28  发布在  Python
关注(0)|答案(3)|浏览(147)

有没有可能在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等)

bmp9r5qi

bmp9r5qi1#

从python 3.6开始,你可以在组中使用flag:
(?imsx-imsx:...)
(Zero或来自集合‘i’、‘m’、‘s’、‘x’的一个或多个字母,可选地后跟‘-’,后跟来自同一集合的一个或多个字母。)re.I(忽略大小写)、re.M(多行)、re.S(点匹配所有)和re.X(冗长),用于表达式的一部分。
因此,(?i:use)现在是一个正确的语法。从python3.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'>
qq24tv8q

qq24tv8q2#

据我所知,python正则表达式引擎不支持partial 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
btqmn9zl

btqmn9zl3#

According to the docs,这是不可能的。(?x)语法只允许你修改整个表达式的标志。因此,你必须把它分成三个regexp,然后一个接一个地应用它们 * 或者 * 手动执行“忽略大小写”:/[uU][sS][eE]...

相关问题