如何在含re.IGNORECASE的正则中指定单个字母大小写
解决Python正则忽略大小写模式下强制首字母大写匹配的问题
问题背景
- 需要匹配
Table 1.1-1 Abcd、FIGURE 1: Efg、Image 1.1 Hijk lmn这类文本,拒绝Table 1.1: abcd efg——要求Table/Figure/Image等关键词本身不区分大小写,但关键词后的内容首字母必须大写 - 现有正则已启用
re.IGNORECASE标志,不想大幅修改原有代码,之前尝试[A-Z]、(?-i)未达到预期效果
修改方案
核心是在全局忽略大小写的模式下,对关键词后续的首字母匹配部分局部关闭忽略大小写,具体修改如下:
pattern = re.compile( r"^(?!.*[._…-]{{3,}}\s*\d+$)([1-9]\d?)?\s?({})\s+({}):?\s?(?-i)[A-Z].*".format( '|'.join(SECTION_KWT), SN_KW_SECTION ), re.DOTALL | re.IGNORECASE )
原理说明
- 原有正则中
.*会匹配任意字符,但因为全局开启re.IGNORECASE,[A-Z]会同时匹配大小写字母,所以无法区分首字母大小写 - 添加
(?-i)后,会关闭后续正则片段的忽略大小写模式,此时[A-Z]只会匹配大写英文字母,满足首字母必须大写的要求 - 这个修改仅针对首字母匹配部分,不会影响前面
Table/Figure/Image等关键词的大小写不敏感匹配
内容的提问来源于stack exchange,提问作者Chuang Men
相关产品推荐
相关产品推荐

