[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접미사 (예 🙂 와 같은 것을 찾을 수 없습니다 m/test/i.



답변

전달 re.IGNORECASE받는 사람 flags의 PARAM search, match또는 sub:

re.search('test', 'TeSt', re.IGNORECASE)
re.match('test', 'TeSt', re.IGNORECASE)
re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)


답변

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)


답변

수입품

import re

런타임 처리에서 :

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

사용하지 않는 re.compile것은 낭비입니다. 위의 match 메소드가 호출 될 때마다 정규 표현식이 컴파일됩니다. 이것은 다른 프로그래밍 언어에서도 잘못입니다. 아래는 더 나은 방법입니다.

앱 초기화에서 :

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

런타임 처리에서 :

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


답변

#'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'>


답변

대소 문자를 구분하지 않는 작업을 수행하려면 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'