Làm thế nào để kiểm tra một chuỗi cho các ký tự cụ thể? [đóng cửa]


182

Làm cách nào để kiểm tra xem một chuỗi có một vài ký tự cụ thể trong đó bằng Python 2 không?

Ví dụ, đưa ra chuỗi sau:

Bọn tội phạm đã đánh cắp 1.000.000 đô la đá quý.

Làm cách nào để phát hiện nếu nó có ký hiệu đô la ("$"), dấu phẩy (",") và số?


1
Điều đó có nghĩa là mọi nhân vật được coi là một trong số đó, hay liệu một (hoặc tất cả) các nhân vật này có mặt trong chuỗi? Họ có phải theo thứ tự nào đó (ví dụ: $ 2,00) để nó hợp lệ không?
NullUserException

2
Cũng giống như một cách tiếp cận khác, not set(p).isdisjoint(set("0123456789$,"))đâu plà chuỗi để kiểm tra.
Kevin

Câu trả lời:


265

Giả sử chuỗi của bạn là 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

Và như vậy cho các nhân vật khác.

... hoặc là

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

... hoặc là

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

[Chỉnh sửa: đã thêm '$' in scâu trả lời]


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

Có bất kỳ lý do cụ thể tại sao giá trị trên không tìm thấy được giữ -1 và không 0 ??
akki

2
@akki không tìm thấy là -1 vì 0 là chỉ số của ký tự đầu tiên trong chuỗi. Do đó "abc" .find ('a') = 0. Sẽ là mơ hồ nếu 0 cũng là giá trị không tìm thấy.
lemiant

1
Tôi thích phiên bản cuối cùng sử dụng any(). Có cách nào để đề cập đến nhân vật được tìm thấy ctheo kiểu pythonic (dường như chỉ nằm trong phạm vi bên trong any()), hoặc tôi sẽ cần làm cho việc tìm kiếm một vài ký tự rõ ràng hơn?
Jens

3
Ví dụ thứ hai bị hỏng: regex cần phải có dấu ngoặc r'[\d\$,]'để nó khớp với bất kỳ ký tự nào trong số đó và else:thiếu dấu hai chấm ở cuối.
bjnord

23

người dùng Jochen Ritzel đã nói điều này trong một bình luận cho câu trả lời cho câu hỏi này từ người dùng dappawit. Nó nên hoạt động:

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

'1', '2', v.v. nên được thay thế bằng các ký tự bạn đang tìm kiếm.

Xem trang này trong tài liệu Python 2.7 để biết một số thông tin về chuỗi, bao gồm về việc sử dụng intoán tử để kiểm tra chuỗi con.

Cập nhật: Điều này thực hiện công việc tương tự như đề xuất ở trên của tôi với ít sự lặp lại:

# 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 này nhỏ gọn hơn nhiều .find () và vẫn ổn miễn là số lượng ký tự được tìm kiếm thấp. Không cần dấu ngoặc đơn mặc dù.
Sean

1
@Sean Giới thiệu về các ngoặc đơn: Tôi biết, tuy nhiên tôi luôn dễ dàng sử dụng chúng hơn là luôn nhớ thứ tự ưu tiên :-).
Abbafei

11

So sánh nhanh thời gian trả lời bài đăng của 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))

Đầu ra:

Func1 Time: 0.0737484362111
Func2 Time: 0.0125144964371

Vì vậy, mã nhỏ gọn hơn với bất kỳ, nhưng nhanh hơn với điều kiện.


EDIT: TL; DR - Đối với chuỗi dài, if-then vẫn nhanh hơn bất kỳ!

Tôi quyết định so sánh thời gian cho một chuỗi ngẫu nhiên dài dựa trên một số điểm hợp lệ được nêu trong các nhận xét:

# 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))

Đầu ra:

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

If-then gần như là một thứ tự cường độ nhanh hơn bất kỳ!


1
chính xác những gì tôi muốn biết :-)
Lars

1
Bất cứ ai cũng có thể giải thích tại sao điều kiện nhanh hơn nhiều so với sử dụng?
Josh

@Josh có lẽ là vì nó đơn giản hơn. Func1 sử dụng sự hiểu biết danh sách bùng nổ để nó tự động chờ đợi phức tạp hơn cho những điều đơn giản. Nhưng với 1000 ký tự, có thể nhanh hơn khi sử dụng Func1
Hack5

@ Hack5 giả sử phrasemột chuỗi có bảng chữ cái từ A đến Z và tôi muốn in bảng chữ cái nào không có trong chuỗi đó sẽ sử dụng any()tốt hơn? hoặc có cách nào ngắn để kiểm tra?
Avishek Datta Ray

@Barefaces Bare ở mức độ đó, chọn bất cứ ai trông đẹp hơn. Tốc độ có thể không thành vấn đề, trừ khi bạn kiểm soát vũ khí hạt nhân (trong trường hợp đó bạn không nên sử dụng python)
Hack5

5

Điều này sẽ kiểm tra xem các chuỗi được tạo thành từ một số kết hợp hoặc chữ số, ký hiệu đô la và dấu phẩy. Có phải đó là những gì bạn đang tìm kiếm?

nhập khẩu lại

s1 = 'Chuỗi thử nghiệm'
s2 = '1234,12345 $'

regex = re.compile ('[0-9, $] + $')

if (regex.match (s1)):
   in "s1 khớp"
khác:
   in "s1 không khớp"

if (regex.match (s2)):
   in "s2 khớp"
khác:
   in "s2 không khớp"

Bạn không phải thoát $ nếu nó thuộc lớp nhân vật. Ngoài ra, điều này sẽ phù hợp 'testing $tring', điều mà tôi không nghĩ là điều OP muốn xảy ra.
NullUserException

Nếu tôi nhớ lại một cách chính xác, nó sẽ không khớp với 'testing $tring'nó nếu matchphương thức được sử dụng, chỉ khi searchđược sử dụng. Vì vậy, tôi nghĩ rằng mã của ông là tốt.
dappawit

@dappa Nó vẫn sẽ khớp '$string'mặc dù
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")   

khác:
in ("Ký tự đặc biệt không gian")


1
Bạn có thể vui lòng cung cấp thêm một chút bối cảnh cho câu trả lời của bạn.
khỉ đồng

kiểm tra loại ký tự có trong chuỗi: isalnum (): Trả về Đúng nếu tất cả các ký tự là chữ và số (a đến z, A đến Z, 0 đến 9) isalpha (): Trả về Đúng nếu tất cả các ký tự chỉ là ký hiệu bảng chữ cái (a đến z, A đến Z), isdigit (): Trả về Đúng nếu tất cả các ký tự chỉ là chữ số (0 đến 9) islower (): Trả về Đúng nếu tất cả các ký tự là ký hiệu chữ cái in thường isupper (): Trả về Đúng nếu tất cả các ký tự đều là ký hiệu aplh.us istitle (): Trả về Đúng nếu chuỗi nằm trong trường hợp tiêu đề isspace (): Trả về Đúng nếu chuỗi chỉ chứa khoảng trắng @LazerBass
Nagaraj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.