다시 컴파일하지 않고 대소 문자를 구분하지 않는 정규 표현식?


331

파이썬에서는 다음을 사용하여 대소 문자를 구분하지 않도록 정규 표현식을 컴파일 할 수 있습니다 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.


답변:


562

전달 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)

2
re.match('test', 'TeSt', re.IGNORECASE)TypeError속성 중 하나 가 될 때로 이어질 수 있습니다 None. first_string == second_string에 의한 일치 try & except를 잡기 위해 사용 합니다 TypeError. 샘플 코드 def equal_ignore_case(first_string, second_string): try: return re.match(first_string, second_string, re.IGNORECASE) is not None except (AttributeError, TypeError): return first_string == second_string 데모 코드
Abhijeet

3
@Abhijeet이 경우에는 try / except를 사용하지 않아야합니다. None먼저 문자열이 있는지 확인하십시오 .
erb

그것은 명명 된 인수를 사용하는 것이 중요 flags위한 re.sub그렇지 않으면 전달 re.IGNORECASE받는 count인자 (들 또한. stackoverflow.com/questions/42581/... )
L3n95

101

IGNORECASE 플래그 (Python 2.7.3에서 테스트)없이 검색 / 일치를 사용하여 대소 문자를 구분하지 않는 검색을 수행 할 수도 있습니다.

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

2
설명서에는 특정 버전에서 추가되는 기능에 대해서는 언급되어 있지 않으므로 ( (?(condition)yes|no)2.4에서 추가 된 것과는 달리 ) re모듈 의 첫 번째 버전 이후로 항상 사용할 수 있다고 생각합니다. 1.5에서. 기본적으로 파이썬과 관련하여 모든 의도와 목적을 위해 시간이 시작된 이후. 이 페이지의 첫 번째 섹션의 절반 쯤에 문서화되어 있습니다. docs.python.org/2/library/re.html#regular-expression-syntax
ArtOfWarfare

4
여기에서 우리는 간다-나는 1.5에 대한 문서를 살펴 보았고이 페이지 아래로의 약 60 %를 문서화 한 것을 발견했다. docs.python.org/release/1.5/lib/… 1.4 문서도 점검했다. 이 기능. regex모듈이 모듈을 위해 더 이상 사용되지 않을 때 1.5에 추가 된 것 같습니다 re.
ArtOfWarfare

3
플래그가 필요하지 않으므로 좋은 해결책입니다. 필자의 경우 Redis에 검색 문자열을 저장하고 있으며 이것이 실제로 유용합니다.
Private

3
@Private : 개념적으로 이전의 캡처 그룹뿐만 아니라 전체 정규 표현식 에 re.I 플래그를 설정합니다 . 그주의 re.match(r'''A ((?i)B) C''', "a b c").group(0)뿐만 아니라 B의 모든 내용에 대소 문자를 구분하지 일치 (A 및 C)를 발생! 특정 캡처 그룹에서 대소 문자 구분 만 일치 시키려면 원하는 드로이드가 아닙니다.
smci

1
@ 비공개 : 예. 요점은 개념적으로 깃발을 설정하는 것과 같습니다. 전체 정규식에. 그 앞에 오는 그룹조차! "다음 캡처 그룹에서만 대소 문자를 구분하지 않는다"는 구문은 없습니다.
smci

53

대소 문자를 구분하지 않는 마커 (?i)는 정규식 패턴에 직접 통합 할 수 있습니다.

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

2
더 나은 옵션, 플랫폼에서 정규식을 이식 가능하게 만들고 선언시 의도가 분명합니다.
Sina Madani

1
'(?i)'방법은 정규 표현식 목록을 만들 수 있다는 장점도 있습니다. 그 중 일부는 대소 문자를 구분하지 않으며 일부는 대소 문자를 구분하지 않습니다. (물론 re.compile원하는 경우 해당 목록을 지도 에 표시 할 수도 있습니다 .)
not-

@SinaMadani 혼란 스러워요. 그보다 휴대가 더 편리 flags=re.IGNORECASE합니까?
Romain Vincent

10

패턴 컴파일 중에 대소 문자를 구분하지 않도록 정의 할 수도 있습니다.

pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)

5
질문에서 OP는 이것을 사용하고 다른 방법이 있는지 묻습니다.
피터 우드

6
빠르게 스크롤하는 데 도움이됩니다.
stevek

6

수입품

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'):

1
감사합니다! 아무도 컴파일에 대해 이야기하지는 않지만 가장 똑똑한 옵션입니다!
StefanJCollier

2
OP는 문자 그대로 ...을 사용 하지 않는 솔루션을 요구 합니다 re.compile().
wpercy

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

4

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

1

교체하고 싶지만 여전히 이전 str의 스타일을 유지하려는 경우. 것이 가능하다.

예를 들어 : 문자열 "test asdasd TEST asd tEst asdasd"를 강조 표시하십시오.

sentence = "test asdasd TEST asd tEst asdasd"
result = re.sub(
  '(test)', 
  r'<b>\1</b>',  # \1 here indicates first matching group.
  sentence, 
  flags=re.IGNORECASE)

테스트 asdasd의 TEST ASD 시험 asdasd


0

대소 문자를 구분하지 않는 정규 표현식 (Regex)의 경우 코드를 추가하여 두 가지 방법이 있습니다.

  1. flags=re.IGNORECASE

    Regx3GList = re.search("(WCDMA:)((\d*)(,?))*", txt, **re.IGNORECASE**)
  2. 대소 문자를 구분하지 않는 마커 (?i)

    Regx3GList = re.search("**(?i)**(WCDMA:)((\d*)(,?))*", txt)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.