Python에서 문자열에 숫자가 포함되어 있는지 확인

개요

사용자 입력을 위한 확인 스크립트를 작성하든 사용자에게 암호에 문자를 포함하도록 요청하는 로그인 양식 – 문자열에 문자가 포함되어 있는지 확인하는 것은 드문 작업이 아닙니다.

이 튜토리얼에서는 마지막에 가장 효율적인 접근 방식에 대한 벤치마크를 포함하여 Python에서 문자열에 숫자/숫자가 포함되어 있는지 여부를 확인할 수 있는 여러 가지 방법을 살펴보겠습니다.

Python에서 문자열에 숫자가 포함되어 있는지 확인

여부를 확인하는 여러 가지 방법이 있습니다. 문자 숫자입니다 (ord(), isnumeric(), isdigit()), for-loop와 결합하여 적어도 하나의 긍정적인 적중을 확인할 수 있습니다. 또는 정규식을 일반 패턴 매처로 사용할 수 있습니다. 이는 유연하고 강력하며 대량의 텍스트 모음에 적용하도록 설계되었습니다. 마지막으로 – 당신은 항상 할 수 있습니다 map() 조건문이 주어진 각 문자 및 반환 True is any() 그들 중 결과 True.

이들 중 하나를 선택하려면 방법의 효율성, 상세도 및 코딩 스타일은 물론 작업과 관련된 업스트림 또는 다운스트림 작업을 고려해야 합니다.

ord()를 사용하여 문자열에 숫자가 포함되어 있는지 확인

XNUMXD덴탈의 ord() 함수는 문자를 받아서 반환합니다. ASCII 값 :

print(ord('0')) 
print(ord('9')) 

ASCII 값 0 48이고 ASCII 값은 9 57입니다. 이들 사이의 모든 숫자는 확장하여 48에서 57 사이의 ASCII 값을 가집니다.. 이제 문자열에 숫자가 있는지 확인하기 위해 전체 입력 문자열을 탐색하고 각 문자의 ASCII 값을 확인합니다. ASCII 값이 47보다 크고 58보다 작으면 숫자임을 의미하고 반환합니다. True:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    ascii_code = ord(ch)
    if 47 < ascii_code < 58:
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

결과 :

Yes, the string contains a number.

isnumeric()을 사용하여 문자열에 숫자가 포함되어 있는지 확인

XNUMXD덴탈의 isnumeric() 함수 반환 True 입력 문자열에 숫자만 포함되어 있으면 반환합니다. False:

str1 = "918"
print("String is whole numeric?", str1.isnumeric())
str2 = "The meaning of the universe is 42"
print("String is whole numeric?", str2.isnumeric())

결과 :

String is whole numeric? True 
String is whole numeric? False

참고 : XNUMXD덴탈의 isnumeric() 기능이 예상대로 작동하지 않습니다. 음수 또는 부동 소수점. 음수 또는 부동 소수점 숫자만 있는 문자열을 전달하면 다음을 반환합니다. False왜냐하면 -. 음수 및 실수와 관련된 문자는 실제로 숫자가 아닙니다.

str1 = "-918"
print("String is whole numeric?", str1.isnumeric()) 

str2 = "91.8"
print("String is whole numeric?", str2.isnumeric()) 

그러나 문자는 Python에서 길이가 1인 문자열일 뿐이므로 문자를 반복하고 사용할 수 있습니다. isnumeric() 숫자인지 확인하려면 다음을 수행하십시오.

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    if ch.isnumeric():
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

isdigit()를 사용하여 문자열에 숫자가 포함되어 있는지 확인

XNUMXD덴탈의 isdigit() 함수는 문자열의 모든 문자가 숫자인지 확인합니다. 그렇다면 – 반환 True, 그렇지 않은 경우 반환 False. 다시 말하지만, 문자는 파이썬에서 길이가 1인 문자열일 뿐이므로 이 방법은 각 문자에 대한 루프에서 사용할 수 있습니다.

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    if ch.isdigit():
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

참고 : XNUMXD덴탈의 isdigit() 메서드는 다음과 같은 방식으로만 작동합니다. isnumeric(), float 또는 음수를 포함하는 문자열을 전달하면 False 특수 문자가 숫자가 아니기 때문에 반환됩니다. 하지만 캐릭터 수준에서 True 값은 문자열에 숫자가 포함되어 있는지 확인하기에 충분합니다. 적용 가능합니다.

isnumeric()과 isdigit()의 차이점은 무엇입니까?

그래서, 차이점은 무엇입니까 isnumeric()isdigit()? 우리가 그것에 있는 동안 – 어떡해 isdecimal()?

  • isnumeric() 어떤 문자가 유니코드 표현숫자 값 (로마 숫자 표현, 위첨자, 아래첨자 및 분수 포함)
  • isdigit() 어떤 문자가 유니코드 숫자 (로마 숫자 표현은 포함하지 않지만 위/아래 첨자 및 분수는 포함)
  • isdecimal() 문자가 있는지 확인 십진수 (이것은 반환됩니다 False 아닌 무엇을 위해 0..9 기본 10에서)

isnumeric() 가장 광범위한 방법인 반면 isdecimal() 셋 중 가장 좁다.

map() 및 any()를 사용하여 문자열에 숫자가 포함되어 있는지 확인

XNUMXD덴탈의 map() function은 map 함수에 전달된 iterable의 각 요소에 대해 제공된 함수를 실행합니다. iterable의 각 요소는 매개변수로 함수에 전달됩니다.

map(function, iterable)

XNUMXD덴탈의 function 의 모든 항목에 대해 실행됩니다. iterable. 이것은 매우 유연하고 강력한 로직을 허용하며, function 당신은 입력을 호출! 메서드는 map 목록이나 세트와 같은 다른 컬렉션으로 쉽게 전환할 수 있는 인스턴스입니다.

문자가 숫자인지 여부를 나타내는 부울을 반환하는 함수를 작성할 수 있습니다. map() 따라서 호출은 부울 값 목록을 생성합니다.

XNUMXD덴탈의 any() 반품 True 전달된 iterable의 요소가 True, 그렇지 않으면 반환 False.

이 두 가지를 함께 연결하면 높은 수준의 짧은 스크립트를 만들고 for 루프를 추상화할 수 있습니다.

def func(ch):
    return ch.isdigit() 

input_string = "My name is Satyam & I am 22 yrs old"
contains_number = any(list(map(func, input_string)))
print("Is there a number present?", contains_number)

결과 :

Is there a number present? True

함수가 한 줄이면 명명된 함수로 추출할 필요가 없습니다. 익명으로 작성하시면 됩니다 람다 함수 간결함을 위해 대신:

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

input_string = "My name is Satyam & I am 22 yrs old"
contains_number = any(list(map(lambda ch: ch.isdigit(), input_string)))
print("Is there any number present?", contains_number)

또한 다음과 같은 결과가 발생합니다.

Is there any number present? True

정규식을 사용하여 Python에서 문자열에 숫자가 포함되어 있는지 확인

정규식은 검색 패턴 입력 텍스트와 일치하도록 설계되었습니다. 그것들은 융통성이 있고 그 특성이 주어집니다. 검색할 동일한 패턴에 대해 임의의 수의 표현식을 작성할 수 있을 뿐만 아니라 생각할 수 있는 모든 다루기 쉬운 패턴을 다룰 수 있습니다.

파이썬 re 모듈은 정규식에 대해 텍스트를 작성, 컴파일 및 일치시키는 데 사용됩니다. 다음과 같은 다양한 방법을 노출합니다. match() 문자열이 패턴으로 시작하는지 여부와 일치합니다. search() 문자열에서 가능한 많은 일치 항목의 첫 번째 항목을 찾습니다. findall() 모든 발생을 확인합니다.

참고 : 세 가지 방법 모두 patternsearch 인수를 선택하고 검색을 실행합니다. pattern FBI 증오 범죄 보고서 search 끈.

식별하는 패턴 손가락 is "d+":

import re
input_string = "My name is Satyam & I am 22 yrs old"
match = re.search(r"d+", input_string)
if match:
    print("Is there any number present?", "Yes")
else:
    print("Is there any number present?", "No")

XNUMXD덴탈의 search() 메소드는 re.Match 찾은 일치 항목과 시작 및 끝 인덱스를 포함하는 객체:


객체인지 여부에 따라 부울 값으로 평가할 수 있습니다. re.Match 개체 또는 None. 결과는 다음과 같습니다.

Is there any number present? Yes

달리 search() 방법, findall() 메서드는 패턴의 첫 번째 항목 대신 모든 항목을 반환합니다.

import re
input_string = "My name is Satyam & I am 22 yrs old"
match = re.findall(r"d+", input_string)
if match:
    print("Is there any number present?", "Yes")
else:
    print("Is there any number present?", "No")

결과 :

Is there any number present? Yes

Benchmarking

성능은 어떻습니까? 논리를 추출하고 불필요한 부분을 제거하여 결과만 반환하도록 메서드를 제한하면 동일한 입력에서 서로를 비교하여 쉽게 벤치마킹할 수 있습니다.

%timeit ord_check()
%timeit isnumeric_check()
%timeit is_digit_check()
%timeit lambda_check()
%timeit regex_check()

결과 :

2.18 µs ± 51.5 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
2.04 µs ± 639 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
1.88 µs ± 448 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
5.07 µs ± 915 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
1.47 µs ± 3.41 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

일반적으로 for-loop 접근 방식은 특정 메서드의 오버헤드가 거의 없이 거의 같은 시간에 실행됩니다. 람다 any() 사실상 가장 느립니다(목록을 목록으로 변환한 다음 축소하기 때문에 많은 중복 작업).

그러나 더 긴 입력 텍스트에서는 특히 일치하는 숫자의 수(숫자가 일반적인지 여부)에 따라 각 접근 방식의 시간 복잡도가 강조됩니다.

import random
import string

input_string_random = ''.join(random.choices(string.ascii_uppercase + string.digits, k=1000))
print(input_string_random) 

input_string_with_single_digit = ''.join(random.choices(string.ascii_uppercase, k=1000)) + '1'
print(input_string_with_single_digit) 

첫 번째 문자열은 숫자와 문자 수가 거의 같은 임의의 시퀀스를 생성하는 반면 후자는 끝에 한 자리 숫자가 있는 문자 전용 문자열입니다(최악의 시간 복잡도).

%timeit ord_check(input_string_random)
504 ns ± 22.6 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit ord_check(input_string_with_single_digit)
76.2 µs ± 1.36 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit isnumeric_check(input_string_random)
756 ns ± 170 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit isnumeric_check(input_string_with_single_digit)
76.2 µs ± 8.43 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit is_digit_check(input_string_random)
549 ns ± 102 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit is_digit_check(input_string_with_single_digit)
65 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit lambda_check(input_string_random)
114 µs ± 8.77 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit lambda_check(input_string_with_single_digit)
119 µs ± 6.23 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit regex_check(input_string_random)
996 ns ± 19.8 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit regex_check(input_string_with_single_digit)
22.2 µs ± 1.77 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

적중 횟수가 적으면 정규식의 성능이 가장 좋습니다. 적중 횟수가 많은 경우 람다 함수 접근 방식이 가장 성능이 좋으며 시간 복잡도 유지 입력에 적중이 많든 적든 상관 없습니다. 주요 단점(적중률이 낮을 때 중복 계산)은 중복으로 인해 입력에 견고해지기 때문에 주요 강점으로 바뀝니다.

결론

이 자습서에서는 Python의 문자열에 적어도 하나의 문자가 포함되어 있는지 확인하는 여러 가지 방법을 살펴보았습니다. 우리는 ord(), isnumeric(), isdigit()isdecimal() 함수를 사용하여 람다 함수 호출로 이 논리를 추상화하는 방법 map()any(). 그런 다음 정규 표현식을 살펴보고 다양한 입력으로 접근 방식을 벤치마킹했습니다.

타임 스탬프 :

더보기 스택카부스