Регулярное выражение без учета регистра без повторной компиляции?

StackOverflow https://stackoverflow.com/questions/500864

Вопрос

В 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's i суффикс (например, m/test/i) в документации.

Это было полезно?

Решение

Пройти 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)

Другие советы

Вы также можете выполнять поиск без учета регистра, используя search / match без флага IGNORECASE (протестировано в Python 2.7.3):

re.search(r'(?i)test', 'TeSt').group()    ## returns 'TeSt'
re.match(r'(?i)test', 'TeSt').group()     ## returns 'TeSt'

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

>>> import re
>>> s = 'This is one Test, another TEST, and another test.'
>>> re.findall('(?i)test', s)
['Test', 'TEST', 'test']

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

pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)
#'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'>

В импорте

import re

Во время обработки во время выполнения:

RE_TEST = r'test'
if re.match(RE_TEST, 'TeSt', re.IGNORECASE):

Следует отметить, что не используя re.compile это расточительно.Каждый раз, когда вызывается описанный выше метод сопоставления, регулярное выражение будет скомпилировано.Это также ошибочная практика в других языках программирования.Ниже приведена лучшая практика.

Инициализация в приложении:

self.RE_TEST = re.compile('test', re.IGNORECASE)

Во время обработки во время выполнения:

if self.RE_TEST.match('TeSt'):

Чтобы выполнять операции без учета регистра, укажите re.IGNORECASE

>>> import re
>>> test = 'UPPER TEXT, lower text, Mixed Text'
>>> re.findall('text', test, flags=re.IGNORECASE)
['TEXT', 'text', 'Text']

и если мы хотим заменить текст, соответствующий регистру...

>>> def matchcase(word):
        def replace(m):
            text = m.group()
            if text.isupper():
                return word.upper()
            elif text.islower():
                return word.lower()
            elif text[0].isupper():
                return word.capitalize()
            else:
                return word
        return replace

>>> re.sub('text', matchcase('word'), test, flags=re.IGNORECASE)
'UPPER WORD, lower word, Mixed Word'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top