[python] 대소 문자를 구분하지 않음

파이썬에서 대소 문자를 구분하지 않는 문자열 대체를 수행하는 가장 쉬운 방법은 무엇입니까?



답변

string유형은이 기능을 지원하지 않습니다. re.IGNORECASE 옵션 과 함께 정규 표현식 하위 메소드 를 사용 하는 것이 가장 좋습니다 .

>>> import re
>>> insensitive_hippo = re.compile(re.escape('hippo'), re.IGNORECASE)
>>> insensitive_hippo.sub('giraffe', 'I want a hIPpo for my birthday')
'I want a giraffe for my birthday'


답변

import re
pattern = re.compile("hello", re.IGNORECASE)
pattern.sub("bye", "hello HeLLo HELLO")
# 'bye bye bye'


답변

한 줄로 :

import re
re.sub("(?i)hello","bye", "hello HeLLo HELLO") #'bye bye bye'
re.sub("(?i)he\.llo","bye", "he.llo He.LLo HE.LLO") #'bye bye bye'

또는 선택적 “flags”인수를 사용하십시오.

import re
re.sub("hello", "bye", "hello HeLLo HELLO", flags=re.I) #'bye bye bye'
re.sub("he\.llo", "bye", "he.llo He.LLo HE.LLO", flags=re.I) #'bye bye bye'


답변

bFloch의 답변을 계속하면이 기능은 하나가 아니라 새로운 것으로 오래된 모든 항목을 변경합니다 (대소 문자를 구분하지 않음).

def ireplace(old, new, text):
    idx = 0
    while idx < len(text):
        index_l = text.lower().find(old.lower(), idx)
        if index_l == -1:
            return text
        text = text[:index_l] + new + text[index_l + len(old):]
        idx = index_l + len(new)
    return text


답변

Blair Conrad와 같이 string.replace는 이것을 지원하지 않습니다.

정규식을 사용 re.sub하지만 대체 문자열을 먼저 이스케이프해야합니다. 에 대한 플래그 옵션은 2.6에 re.sub없으므로 임베디드 수정자를 사용해야합니다.'(?i)' (또는 RE 객체, Blair Conrad의 답변 참조). 또한 또 다른 함정은 문자열이 제공되면 sub가 대체 텍스트에서 백 슬래시 이스케이프를 처리한다는 것입니다. 이것을 피하기 위해 대신 람다를 전달할 수 있습니다.

기능은 다음과 같습니다.

import re
def ireplace(old, repl, text):
    return re.sub('(?i)'+re.escape(old), lambda m: repl, text)

>>> ireplace('hippo?', 'giraffe!?', 'You want a hiPPO?')
'You want a giraffe!?'
>>> ireplace(r'[binfolder]', r'C:\Temp\bin', r'[BinFolder]\test.exe')
'C:\\Temp\\bin\\test.exe'


답변

이 기능은 str.replace()re.findall()기능을 모두 사용합니다 . 그것은 모든 발행 수 대체 할 pattern의를 string가진 repl소문자를 구분하지 않는 방식으로.

def replace_all(pattern, repl, string) -> str:
   occurences = re.findall(pattern, string, re.IGNORECASE)
   for occurence in occurences:
       string = string.replace(occurence, repl)
       return string


답변

RegularExp가 필요하지 않습니다.

def ireplace(old, new, text):
    """
    Replace case insensitive
    Raises ValueError if string not found
    """
    index_l = text.lower().index(old.lower())
    return text[:index_l] + new + text[index_l + len(old):]