Нечувствительное к регистру регулярное выражение Python без re.compile

В Python я могу скомпилировать регулярное выражение без учета регистра, используя re.compile:

>>> s = 'TeSt'
>>> casesensitive = re.compile('test')
>>> ignorecase = re.compile('test', re.IGNORECASE)
>>> 
>>> print casesensitive.match(s)
None
>>> print ignorecase.match(s)
<_sre.SRE_Match object at 0x02F0B608>

Есть ли способ сделать то же самое, но без использования re.compile. Я не могу найти ничего похожего на суффикс Perl i (e. г. m/test/i) в документации.

вопрос задан 1.02.2009
Mat
22918 репутация

6 ответов


  • 375 рейтинг

    Передайте re.IGNORECASE в параметр flags search , match или sub :

    re.search('test', 'TeSt', re.IGNORECASE)
    re.match('test', 'TeSt', re.IGNORECASE)
    re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)
    
    ответ дан Michael Haren, с репутацией 73324, 1.02.2009
  • 67 рейтинг

    Вы также можете выполнять поиск без учета регистра, используя поиск / совпадение без флага IGNORECASE (протестировано в Python 2. 7. 3):

    re.search(r'(?i)test', 'TeSt').group()    ## returns 'TeSt'
    re.match(r'(?i)test', 'TeSt').group()     ## returns 'TeSt'
    
    ответ дан aem999, с репутацией 10987, 4.05.2012
  • 25 рейтинг

    Маркер без учета регистра, (?i), может быть включен непосредственно в шаблон регулярного выражения:

    >>> import re
    >>> s = 'This is one Test, another TEST, and another test.'
    >>> re.findall('(?i)test', s)
    ['Test', 'TEST', 'test']
    
    ответ дан Raymond Hettinger, с репутацией 125662, 23.02.2017
  • 7 рейтинг

    Вы также можете определить регистр без учета регистра при компиляции шаблона:

    pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)
    
    ответ дан panofish, с репутацией 3018, 12.05.2014
  • 3 рейтинг
    #'re.IGNORECASE' for case insensitive results short form re.I
    #'re.match' returns the first match located from the start of the string. 
    #'re.search' returns location of the where the match is found 
    #'re.compile' creates a regex object that can be used for multiple matches
    
     >>> s = r'TeSt'   
     >>> print (re.match(s, r'test123', re.I))
     <_sre.SRE_Match object; span=(0, 4), match='test'>
     # OR
     >>> pattern = re.compile(s, re.I)
     >>> print(pattern.match(r'test123'))
     <_sre.SRE_Match object; span=(0, 4), match='test'>
    
    ответ дан jackotonye, с репутацией 1059, 12.10.2016