IT이야기

대/소문자를 구분하지 않는 문자열 비교 방법

cyworld 2022. 4. 4. 21:13
반응형

대/소문자를 구분하지 않는 문자열 비교 방법

Python에서 대/소문자 구분 문자열을 비교하려면 어떻게 해야 하는가?

나는 일반 문자열과 저장소 문자열의 비교를 매우 간단하고 피토닉적인 방법으로 캡슐화하고 싶다.나는 또한 규칙적인 비단뱀 문자열을 이용하여 문자열이 명령하는 해시(hashed)로 값을 조회할 수 있는 능력을 갖고 싶다.

ASCII 문자열 가정:

string1 = 'Hello'
string2 = 'hello'

if string1.lower() == string2.lower():
    print("The strings are the same (case insensitive)")
else:
    print("The strings are NOT the same (case insensitive)")

Python 3.3에서 케이스폴드()가 더 나은 대안이다.

string1 = 'Hello'
string2 = 'hello'

if string1.casefold() == string2.casefold():
    print("The strings are the same (case insensitive)")
else:
    print("The strings are NOT the same (case insensitive)")

보다 복잡한 유니코드 비교를 처리하는 보다 포괄적인 솔루션을 원하는 경우 다른 답변을 참조하십시오.

대소문자를 구분하지 않는 방법으로 비교하는 것은 사소한 것처럼 보이지만, 그렇지 않다.여기는 파이톤2가 발달이 안 돼서 파이톤3를 쓸 거야.

유니코드에서 대소문자를 구분하는 변환은 사소한 것이 아니라는 점을 먼저 주목해야 한다.에 해당하는 텍스트가 있다.text.lower() != text.upper().lower()예를 들어"ß":

"ß".lower()
#>>> 'ß'

"ß".upper().lower()
#>>> 'ss'

하지만 당신이 아무렇게나 비교하고 싶었다고 가정해보자."BUSSE"그리고"Buße"헉, 너도 아마 비교하고 싶을 거야."BUSSE"그리고"BUẞE"동일하다 - 그것이 새로운 자본 형태다.권장되는 방법은 다음과 같다.

str.casepoldd

대소문자를 접은 문자열 사본을 반환하십시오.대소문자 구분 문자열은 무현상 일치를 위해 사용할 수 있다.

케이스폴딩은 로어캐스팅과 유사하지만 문자열의 모든 케이스 구분을 제거하기 위한 것이기 때문에 더욱 공격적이다.[...]

사용만 하지 마십시오.lower. 만약casefold사용할 수 없는 경우.upper().lower()도움이 된다(그러나 약간만).

그렇다면 억양을 고려해야 한다.만약 당신의 폰트 렌더러가 좋다면, 당신은 아마도"ê" == "ê"- 그러나 다음 사항은 아니다.

"ê" == "ê"
#>>> False

후자의 억양이 결합한 캐릭터이기 때문이다.

import unicodedata

[unicodedata.name(char) for char in "ê"]
#>>> ['LATIN SMALL LETTER E WITH CIRCUMFLEX']

[unicodedata.name(char) for char in "ê"]
#>>> ['LATIN SMALL LETTER E', 'COMBINING CIRCUMFLEX ACCENT']

이 문제를 해결하는 가장 간단한 방법은 아마도 NFKD 정상화를 사용하고 싶을 것이다. 그러나 설명서를 확인하십시오.그러면 한 사람이 한다.

unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
#>>> True

마무리하기 위해, 다음은 함수로 표현된다.

import unicodedata

def normalize_caseless(text):
    return unicodedata.normalize("NFKD", text.casefold())

def caseless_equal(left, right):
    return normalize_caseless(left) == normalize_caseless(right)

Python 2를 사, 호로 .lower()각 문자열 또는 유니코드 객체에서...

string1.lower() == string2.lower()

...대부분은 효과가 있을 것이지만, @tchrist가 설명한 상황에서는 실제로 효과가 없다.

파일이 있다고 가정해 보십시오.unicode.txt두 개의 현을 포함하는Σίσυφος그리고ΣΊΣΥΦΟΣ Python 2를 사용하는 경우:

>>> utf8_bytes = open("unicode.txt", 'r').read()
>>> print repr(utf8_bytes)
'\xce\xa3\xce\xaf\xcf\x83\xcf\x85\xcf\x86\xce\xbf\xcf\x82\n\xce\xa3\xce\x8a\xce\xa3\xce\xa5\xce\xa6\xce\x9f\xce\xa3\n'
>>> u = utf8_bytes.decode('utf8')
>>> print u
Σίσυφος
ΣΊΣΥΦΟΣ

>>> first, second = u.splitlines()
>>> print first.lower()
σίσυφος
>>> print second.lower()
σίσυφοσ
>>> first.lower() == second.lower()
False
>>> first.upper() == second.upper()
True

σ 문자는 ς과 σ의 두 가지 소문자 형식을 가지고 있으며,.lower()케이스-감정적으로 비교하는 건 도움이 안 될 거야

그러나 파이톤 3을 기준으로 세 가지 양식이 모두 to으로 해결되며, 양쪽 문자열의 lower()를 호출하는 것이 올바르게 작동한다.

>>> s = open('unicode.txt', encoding='utf8').read()
>>> print(s)
Σίσυφος
ΣΊΣΥΦΟΣ

>>> first, second = s.splitlines()
>>> print(first.lower())
σίσυφος
>>> print(second.lower())
σίσυφος
>>> first.lower() == second.lower()
True
>>> first.upper() == second.upper()
True

따라서 그리스어의 세 시그마처럼 가장자리 케이스에 관심이 있다면 파이톤 3을 사용하십시오.

(참조용으로는 위의 통역 출력물에 파이썬 2.7.3과 파이썬 3.3.0b1이 나와 있다.)

유니코드 표준의 섹션 3.13은 무현상 일치를 위한 알고리즘을 정의한다.

X.casefold() == Y.casefold()python 3에서는 "기본 캐시리스 매칭"(D144)을 구현한다.

Casefolding은 모든 경우에 문자열의 정규화를 보존하지 않으므로 정규화를 수행해야 한다('å''å') D145는 "캐논리적 현금 없는 매칭"을 도입한다.

import unicodedata

def NFD(text):
    return unicodedata.normalize('NFD', text)

def canonical_caseless(text):
    return NFD(NFD(text).casefold())

NFD()U+0345 문자와 관련된 매우 드문 에지 케이스에 대해 두 번 호출된다.

예:

>>> 'å'.casefold() == 'å'.casefold()
False
>>> canonical_caseless('å') == canonical_caseless('å')
True

또한 다음과 같은 경우에 대한 호환성 Casless 매칭(D146)도 있다.'㎒'(U+3392) 및 "식별자 현금 없는 일치"로 식별자의 현금 없는 일치를 단순화하고 최적화한다.

는 이 해결책이 regex를 사용하는 것을 보았다.

import re
if re.search('mandy', 'Mandy Pande', re.IGNORECASE):
# is True

억양에 잘 맞는다.

In [42]: if re.search("ê","ê", re.IGNORECASE):
....:        print(1)
....:
1

그러나 대/소문자를 구분하지 않는 유니코드 문자에서는 작동하지 않는다.@Rhymoid가 내가 이해한 바로는 그 사건이 사실이기 위해서는 정확한 기호가 필요하다는 것을 지적해줘서 고맙다.출력은 다음과 같다.

In [36]: "ß".lower()
Out[36]: 'ß'
In [37]: "ß".upper()
Out[37]: 'SS'
In [38]: "ß".upper().lower()
Out[38]: 'ss'
In [39]: if re.search("ß","ßß", re.IGNORECASE):
....:        print(1)
....:
1
In [40]: if re.search("SS","ßß", re.IGNORECASE):
....:        print(1)
....:
In [41]: if re.search("ß","SS", re.IGNORECASE):
....:        print(1)
....:

casefold() 메서드를 사용할 수 있다.casefold() 방법은 비교할 때 사례를 무시한다.

firstString = "Hi EVERYONE"
secondString = "Hi everyone"

if firstString.casefold() == secondString.casefold():
    print('The strings are equal.')
else:
    print('The strings are not equal.')

출력:

The strings are equal.

일반적인 접근방식은 검색 및 비교를 위해 문자열의 대소문자를 구분하거나 대소문자를 구분하는 것이다.예를 들면 다음과 같다.

>>> "hello".upper() == "HELLO".upper()
True
>>> 

먼저 소문자로 변환하는 게 어때?사용할 수 있다string.lower().

는 사례를 언급할 수 있다.

data['Column_name'].str.contains('abcd', case=False)
def insenStringCompare(s1, s2):
    """ Method that takes two strings and returns True or False, based
        on if they are equal, regardless of case."""
    try:
        return s1.lower() == s2.lower()
    except AttributeError:
        print "Please only pass strings into this method."
        print "You passed a %s and %s" % (s1.__class__, s2.__class__)

이것은 내가 지난 주 동안 사랑/혐오하는 것을 배운 또 다른 regex이기 때문에 보통 (이 경우 예) 내 감정을 반영하는 것으로 수입한다! 정상적인 기능을 만들어라....입력을 요청하고 나서 ....something = re.compile(r'foo*|스팸*, yes)을 사용한다.나)...... 리.I(아래.I)는 INGECASE와 동일하지만, 당신은 그것을 쓰는 많은 실수를 할 수 없다!

그리고 나서 당신은 regex를 사용하여 당신의 메시지를 검색하지만 솔직히 그것은 그것 자체의 몇 페이지여야 하지만 요점은 foo나 스팸이 함께 pip으로 연결되고 케이스는 무시된다는 것이다.그런 다음 둘 중 하나가 발견되면 lost_n_found는 이들 중 하나를 표시한다. 둘 중 어느 것도 발견되지 않으면 lost_n_found는 none과 동일하다.none과 같지 않으면 "return lost_n_found.lower()"를 사용하여 사용자_input을 소문자로 되돌린다.

이것은 대소문자를 구분할 수 있는 어떤 것이든 훨씬 더 쉽게 매치할 수 있게 해준다.마지막으로 (NCS)는 "아무도 심각하게 신경쓰지 않는다...!" 또는 대소문자를 구분하지 않는....어느 쪽이든

질문 있는 사람이 있으면..

    import re as yes

    def bar_or_spam():

        message = raw_input("\nEnter FoO for BaR or SpaM for EgGs (NCS): ") 

        message_in_coconut = yes.compile(r'foo*|spam*',  yes.I)

        lost_n_found = message_in_coconut.search(message).group()

        if lost_n_found != None:
            return lost_n_found.lower()
        else:
            print ("Make tea not love")
            return

    whatz_for_breakfast = bar_or_spam()

    if whatz_for_breakfast == foo:
        print ("BaR")

    elif whatz_for_breakfast == spam:
        print ("EgGs")

참조URL: https://stackoverflow.com/questions/319426/how-do-i-do-a-case-insensitive-string-comparison

반응형