특정 문자의 문자열을 확인하는 방법은 무엇입니까? [닫은]


182

파이썬 2를 사용하여 문자열에 몇 개의 특정 문자가 있는지 어떻게 확인할 수 있습니까?

예를 들어, 다음 문자열이 주어집니다.

범죄자들은 ​​보석으로 $ 1,000,000를 훔쳤습니다.

달러 기호 ( "$"), 쉼표 ( ",") 및 숫자가 있는지 어떻게 감지합니까?


1
그것은 모든 문자가 이것들 중 하나 여야한다는 것을 의미합니까, 아니면이 문자들 중 하나 (또는 ​​전부)가 문자열에 존재하는 것으로 충분합니까? 그것들이 유효하려면 어떤 순서 (예 : $ 2,00) 여야합니까?
NullUserException

2
다른 종류의 접근 방식과 마찬가지로 테스트 할 문자열은 not set(p).isdisjoint(set("0123456789$,"))어디에 있습니까 p?
케빈

답변:


265

문자열을 가정하면 s:

'$' in s        # found
'$' not in s    # not found

# original answer given, but less Pythonic than the above...
s.find('$')==-1 # not found
s.find('$')!=-1 # found

다른 캐릭터들도 마찬가지입니다.

... 또는

pattern = re.compile(r'\d\$,')
if pattern.findall(s):
    print('Found')
else
    print('Not found')

... 또는

chars = set('0123456789$,')
if any((c in chars) for c in s):
    print('Found')
else:
    print('Not Found')

[편집 : '$' in s답변 추가 ]


20
s.find('$')!=-1=> '$' in s:-)
Jochen Ritzel

발견되지 않은 값이 -1이 아닌 0이 아닌 특별한 이유가 있습니까 ??
akki

2
0은 문자열에서 첫 번째 문자의 인덱스이므로 @akki not found는 -1입니다. 따라서 "abc".find ( 'a') = 0입니다. 0도 찾을 수없는 값이면 모호합니다.
lemiant

1
나는를 사용하는 마지막 버전을 좋아합니다 any(). 발견 된 문자 c를 pythonic 스타일 로 참조하는 방법이 있습니까 (내부 any()에만 범위가있는 것 같습니다 ) 또는 여러 문자를 더 명확하게 검색해야합니까?
Jens

3
두 번째 예가 깨졌습니다. 정규 표현식에는 대괄호가 있어야 r'[\d\$,]'해당 문자와 ​​일치 else:하며 끝에 콜론이 없습니다.
bjnord

23

사용자 Jochen Ritzel은 사용자 dappawit 의이 질문에 대한 답변에 대한 주석에서 이것을 말했습니다. 작동해야합니다.

('1' in var) and ('2' in var) and ('3' in var) ...

'1', '2'등은 찾고있는 문자로 바꿔야합니다.

하위 문자열 테스트에 연산자 사용에 대한 정보를 포함하여 문자열에 대한 정보 는 Python 2.7 설명서의이 페이지를 참조하십시오 in.

업데이트 : 이것은 적은 반복으로 위의 제안과 동일한 작업을 수행합니다.

# When looking for single characters, this checks for any of the characters...
# ...since strings are collections of characters
any(i in '<string>' for i in '123')
# any(i in 'a' for i in '123') -> False
# any(i in 'b3' for i in '123') -> True

# And when looking for subsrings
any(i in '<string>' for i in ('11','22','33'))
# any(i in 'hello' for i in ('18','36','613')) -> False
# any(i in '613 mitzvahs' for i in ('18','36','613')) ->True

+1 이것은 여러 개의 .find ()보다 컴팩트하며 검색되는 문자 수가 적은 한 괜찮습니다. 그래도 괄호가 필요하지 않습니다.
Sean

1
@Sean 괄호에 대해 : 나는 항상 우선 순위를 기억하는 것보다 항상 사용하는 것이 더 쉽다는 것을 알고 있습니다 :-).
Abbafei

11

Abbafei의 게시물에 대한 타이밍의 빠른 비교 :

import timeit

def func1():
    phrase = 'Lucky Dog'
    return any(i in 'LD' for i in phrase)

def func2():
    phrase = 'Lucky Dog'
    if ('L' in phrase) or ('D' in phrase):
        return True
    else:
        return False

if __name__ == '__main__': 
    func1_time = timeit.timeit(func1, number=100000)
    func2_time = timeit.timeit(func2, number=100000)
    print('Func1 Time: {0}\nFunc2 Time: {1}'.format(func1_time, func2_time))

산출:

Func1 Time: 0.0737484362111
Func2 Time: 0.0125144964371

따라서 코드는 더 작지만 조건부에서는 더 빠릅니다.


편집 : TL; DR- 긴 문자열의 경우 if-then은 여전히 어느 것보다 훨씬 빠릅니다!

주석에서 제기 된 몇 가지 유효한 포인트를 기반으로 긴 임의 문자열의 타이밍을 비교하기로 결정했습니다.

# Tested in Python 2.7.14

import timeit
from string import ascii_letters
from random import choice

def create_random_string(length=1000):
    random_list = [choice(ascii_letters) for x in range(length)]
    return ''.join(random_list)

def function_using_any(phrase):
    return any(i in 'LD' for i in phrase)

def function_using_if_then(phrase):
    if ('L' in phrase) or ('D' in phrase):
        return True
    else:
        return False

if __name__ == '__main__':
    random_string = create_random_string(length=2000)
    func1_time = timeit.timeit(stmt="function_using_any(random_string)",
                               setup="from __main__ import function_using_any, random_string",
                               number=200000)
    func2_time = timeit.timeit(stmt="function_using_if_then(random_string)",
                               setup="from __main__ import function_using_if_then, random_string",
                               number=200000)
    print('Time for function using any: {0}\nTime for function using if-then: {1}'.format(func1_time, func2_time))

산출:

Time for function using any: 0.1342546
Time for function using if-then: 0.0201827

그렇다면 어떤 것보다 훨씬 빠릅니다!


1
정확히 내가 알고 싶었던 :-)
Lars

1
왜 조건부보다 어떤 것이 더 빠른지 설명 할 수 있습니까?
Josh

@ 조쉬 아마도 더 단순하기 때문일 것입니다. Func1은 분해 된 목록 이해 기능을 사용하므로 간단한 것에는 자동으로 더 복잡합니다. 그러나 1000 개 문자, 그것은 잘 FUNC1 사용하는 것이 더 빠를 수 있습니다
Hack5

@ Hack5 phrase는 A에서 Z까지의 알파벳이있는 문자열을 가정 하고 어떤 알파벳이 함께 있지 않은지를 인쇄하고 싶습니다. 문자열이 any()더 좋을까요? 또는 확인하는 짧은 방법이 있습니까?
Avishek Datta Ray

@Barefaced Bare는 그런 종류의 레벨에서 더 좋아 보이는 것을 선택하십시오. 핵무기를 제어하지 않는 한 속도는 중요하지 않습니다 (이 경우 파이썬을 사용해서는 안됨)
Hack5

5

문자열이 조합이나 숫자, 달러 기호 및 쉼표로 구성되어 있는지 테스트합니다. 찾고 계십니까?

다시 수입

s1 = '테스트 문자열'
s2 = '1234,12345 $'

정규식 = re.compile ( '[0-9, $] + $')

(regex.match (s1)) 인 경우 :
   "s1 일치"인쇄
그밖에:
   "s1이 일치하지 않습니다"인쇄

(regex.match (s2)) 인 경우 :
   "s2 일치"인쇄
그밖에:
   "s2가 일치하지 않습니다"인쇄

문자 클래스에 있으면 $를 벗어날 필요가 없습니다. 또한 이것은 'testing $tring'OP 와 일치 하기 때문에 OP가 원하지 않는 것으로 생각됩니다.
NullUserException

올바르게 기억 'testing $tring'하면 match메서드를 사용하는 경우에만 사용되며 일치하지 않습니다 search. 그래서 그의 코드는 괜찮다고 생각합니다.
dappawit

@dappa 아직 일치 '$string'하지만
NullUserException

-2
s=input("Enter any character:")   
if s.isalnum():   
   print("Alpha Numeric Character")   
   if s.isalpha():   
       print("Alphabet character")   
       if s.islower():   
         print("Lower case alphabet character")   
       else:   
         print("Upper case alphabet character")   
   else:   
     print("it is a digit")   
elif s.isspace():   
    print("It is space character")   

else :
print ( "비 공간 특수 문자")


1
답변에 좀 더 자세한 내용을 알려주십시오.
금관 악기 원숭이

문자열에 존재하는 문자 유형 확인 : isalnum () : 모든 문자가 영숫자 (a ~ z, A ~ Z, 0 ~ 9)이면 True를 반환합니다. isalpha () : 모든 문자가 알파벳 기호 (a ~ z, A ~ Z), isdigit () : 모든 문자가 숫자 만 인 경우 True를 반환합니다 (0 ~ 9) islower () : 모든 문자가 소문자 인 경우 True를 반환합니다 isupper () : 모든 문자가 대문자 인 경우 True를 반환합니다 istitle () : 문자열이 제목 인 경우 True를 반환합니다. isspace () : 문자열에 공백이 포함 된 경우 True를 반환합니다. @LazerBass
Nagaraj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.