문자열에 알파벳 문자가 포함되어 있는지 어떻게 확인할 수 있습니까?


82

문자열에 알파벳 문자가 포함되어 있는지 확인하는 가장 순수한 Python 구현은 무엇입니까?

string_1 = "(555).555-5555"
string_2 = "(555) 555 - 5555 ext. 5555

알파벳 글자가 없으면 어디로 string_1돌아오고 False편지가 있으면 string_2돌아올 것 True입니다.


2
이것은 영어 a / z 알파벳으로 만 제한되어야합니까? 독일어와 같은 다른 알파벳의 '특수'문자를 고려해야합니까?
Kotch

유니 코드를받을 가능성이 있습니까? 아니면 그냥 평범한 아스키 로마자?
KobeJohn

거기에 좋은 타이밍 :) 어쨌든, 유니 코드 문자로 문자열을 테스트하는 데 도움이 필요하면 비슷한 질문을 확인하십시오.
KobeJohn

1
A / z의 알파벳 영어로 제한 만 만 일반 아스키 로마 문자 :
저스틴 Papez

답변:


123

Regex는 빠른 접근 방식이어야합니다.

re.search('[a-zA-Z]', the_string)

1
JBernado에게 감사합니다. 이것이 제가 한 일이고 제가해야 할 일을 완벽하게 처리합니다.
Justin Papez

30
정규식은 확실히 약간 과잉 인 것 같습니다. any(c.isalpha() for c in string_1)맛있게 Pythonic입니다.
Jollywatt

5
@Joseph 아니요, 아닙니다. 이 정규식은 표현식보다 훨씬 더 읽기 쉽습니다. 또한 isalpha의미는 무엇입니까? 이것은 파이썬 2와 파이썬 3을 비교할 때 완전히 다른 동작을합니다. 중국어가 알파벳의 일부입니까? 그렇지 않은 경우 Python 3 (또는 유니 코드 문자열의 경우 Python 2!)의 생성기와 맹목적으로 일치합니다. Pythonic 을 원하면 여기에 있습니다 Simple is better than complex.. 그리고 위의 OP의 설명을 확인하십시오. 그는 로마 알파벳 만 일치시키기를 원합니다.
JBernardo

1
나는 Joseph의 대답이 완벽하게 읽을 수 있고 확실히 추가 가져 오기보다 빠르다고 생각합니다. 게다가 re.search에서 인수의 순서를 기억할 필요가 없습니다
Hinton

11
다른 사람이 반환 값이 무엇인지 궁금해하는 Match경우 일치 항목이 있거나 None없는 경우 개체 를 얻습니다 . 그래서 이것은 if re.search(...패턴 과 호환됩니다 .
Srini

74

어때 :

>>> string_1 = "(555).555-5555"
>>> string_2 = "(555) 555 - 5555 ext. 5555"
>>> any(c.isalpha() for c in string_1)
False
>>> any(c.isalpha() for c in string_2)
True

시겠습니까 set(string_1)더 efficent 수?
Rik Poggi

1
@Rik. 테스트하기 전에 string_1을 세트로 변환하는 것을 의미합니까? 더 효율적이지 않을 것입니다. 그것은 모든 문자를 적어도 한 번 처리하는 것이 보장되며, any 함수가 첫 번째 거짓을 만나면 단락 (중지) 될 것이라고 믿습니다.
KobeJohn

이 코드는 문자 당 함수 호출이 필요하기 때문에 다소 느립니다. 로 변환 set하면 함수 호출이 줄어들 수도 있고 줄어들 수도 있지만 약간의 오버 헤드가 추가됩니다.
JBernardo

2
@JBernardo : timeit은 컴파일 된 정규식보다 훨씬 느리고 컴파일되지 않은 정규식보다 약 66 % 더 많은 시간이 걸린다는 것을 암시합니다. 그것은 내 "정규 표현식이 싫어요"한도 이내입니다.
DSM

1
물론입니다. "(555) .555-5555 ext. 5555"* 1000을 사용하면 단락으로 인해 비슷한 속도로 돌아갑니다. 나는 정규 표현식을 작성하는 것보다 파이썬으로 작성하는 것을 선호하는데, 이것은 사소하지 않으면 디버그하기 어렵다고 생각하며 성능 요구 사항이 요구하지 않는 한 명확한 파이썬 작성을 포기하지 않을 것입니다.
DSM

27

islower()문자열에를 사용 하여 (다른 문자 중에서) 소문자가 포함되어 있는지 확인할 수 있습니다. 대문자가 포함되어 있는지 확인하기 위해 or함께 isupper():

아래 : 문자열의 문자 : 테스트 결과 참

>>> z = "(555) 555 - 5555 ext. 5555"
>>> z.isupper() or z.islower()
True

아래 : 문자열에 문자 없음 : 테스트 결과 거짓.

>>> z= "(555).555-5555"
>>> z.isupper() or z.islower()
False
>>> 

모든 문자가 문자 인 경우에만 isalpha()반환하는 혼동 True하지 마십시오.

참고 효모의 광산이 잘 혼합 된 경우를 처리하지 않기 때문에 응답이 완료가 멋지게 광산.


3
입력이 모든 문자인지 테스트하는 것이 아니라 문자가 포함되어 있는지 테스트하는 것이 좋습니다.
Cornbeetle

예 @Cornbeetle, 정말 그런 종류의, 그 동안 덕분에 결국 질문에 대한 답
장 - 프랑수아 파브르

이것을 넣는 아주 좋은 방법입니다. 효율성 측면에서 어떻습니까? 정규식보다 낫습니까?
pnv

관련된 파이썬 루프가 없으므로 효율성이 좋습니다. 정규식과 비교하지는 않았지만 컴파일 할 정규식이 없기 때문에 초기화 단계에서 약간 더 빠르다고 생각합니다
Jean-François Fabre

13

@ jean-françois-fabre가 제공하는 답변이 마음에 들었지만 불완전합니다.
그의 접근 방식은 작동하지만 텍스트에 순전히 소문자 또는 대문자가 포함 된 경우에만 :

>>> text = "(555).555-5555 extA. 5555"
>>> text.islower()
False
>>> text.isupper()
False

더 나은 방법은 먼저 문자열을 대문자 또는 소문자로 입력 한 다음 확인하는 것입니다.

>>> string1 = "(555).555-5555 extA. 5555"
>>> string2 = '555 (234) - 123.32   21'

>>> string1.upper().isupper()
True
>>> string2.upper().isupper()
False

8

다음과 같은 정규식을 사용할 수 있습니다.

import re

print re.search('[a-zA-Z]+',string)

2

주어진 문자열에 알파벳이 포함되어 있는지 찾기 위해 위의 각 방법을 테스트하고 표준 컴퓨터에서 문자열 당 평균 처리 시간을 알아 냈습니다.

~ 250ns

import re

~ 3µs

re.search('[a-zA-Z]', string)

~ 6µs

any(c.isalpha() for c in string)

~ 850ns

string.upper().isupper()


주장으로 반대는 수입 을 다시하는 것은 무시할 시간을 소요하고와 검색 다시는 단지 소요 반 시간을 반복 비교 () isalpha에를 도 비교적 작은 문자열.
따라서 더 큰 문자열과 더 많은 수의 경우 re가 훨씬 더 효율적입니다.

그러나 문자열을 대소 문자로 변환하고 대소 문자를 확인하는 것 (즉 upper (). isupper () 또는 lower (). islower () ) 여기에서 승리 합니다. 모든 루프에서 re.search () 보다 훨씬 빠르며 추가 가져 오기도 필요하지 않습니다.


1
추가 최적화를 위해 정규식을 컴파일 할 수도 있습니다. alpha_regex = re.compile ( '[a-zA-Z]') later alpha_regex.search (string)
Behdad Forghani

isalpha ()는 다국어에 적합하지 않습니다. 한국어로 예상되는 문자열에 영어 문자가 포함되어 있고 isalpha () 메서드가 모든 한국어 문자열에 대해 True를 반환하는지 확인하고 싶었 기 때문에 이것을 찾고있었습니다.
Chan Woo

0

당신은 또한 이것을 할 수 있습니다

import re
string='24234ww'
val = re.search('[a-zA-Z]+',string) 
val[0].isalpha() # returns True if the variable is an alphabet
print(val[0]) # this will print the first instance of the matching value

또한 val 변수 가 None을 반환 하면 유의하십시오 . 즉, 검색에서 일치 하는 항목을 찾지 못했음을 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.