regex 模式的不区分大小写部分

zqdjd7g9  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(207)

Python是否有类似vim的东西,允许内联模式中可能有标志的部分,例如不区分大小写?下面是一个例子:

re.search(r'he\cllo', string)

\c是不区分大小写的行内指示符,或者在python中是带有re.I标志的all or nothing?

odopli94

odopli941#

Python有一种实现不区分大小写的内联修饰符的非典型方式。

  • 可以使用(?i)全局启用。这适用于整个字符串...
  • ...... * 除了 * 可以针对以下组选择性地禁用if:(?-i:...).
  • 没有"禁用全局"标志。
  • 可以选择性地为组启用:(?i:...)
  • 在组内应用标志时,组外的任何内容都不受影响。

下面是一些例子。
使用全局标志:

q="HeLLo WorLD"

re.match(r"(?i)he(?-i:LL)o\swoRld", q) # this matches
re.match(r"(?i)he(?-i:ll)o\swoRld", q) # this doesn't match, since 'LL' != 'll'
re.match(r"(?i)he(?-i:Ll)o\swoRld", q) # nor does this, 'LL' != 'Ll'

此操作可以多次执行。只有包含在组中的字符才会被视为区分大小写:

q="HeLLo WorLD"

re.match(r"(?i)he(?-i:LL)o\swo(?-i:r)ld", q) # this matches: 'LL' = 'LL' and 'r' == 'r'
re.match(r"(?i)he(?-i:LL)o\swo(?-i:R)ld", q) # but this doesn't, 'LL' == 'LL' but 'R' != 'r'

全局标志可以应用于模式中的任何地方,但是除前面之外的任何地方都不推荐使用,并且会产生一个DepricationWarning。在Python 3.8中,它仍然有效,并且遵循相同的规则。
下面是非全局方法:

q="HeLLo WorLD"

re.match(r"(?i:h)eLLo\sWorLD", q) # matches, since only enabled for 'h'
re.match(r"(?i:h)eLLo\sworld", q) # doesn't match: flag only applies to the group

某些组合是冗余的,但引擎可以很好地处理它们:

q="HeLLo WorLD"

re.match(r"(?i:h)e(?-i:ll)o\sWorLD", q) # this fails; disabling the flag is redundant
re.match(r"(?i)(?i:h)e(?-i:LL)o\sworld", q) # this matches, but enabling the flag in the first group is redundant, since it's enabled globally

注意:在python 3. 8上测试过。我想旧版本可能对此的处理略有不同。

相关问题