จะตรวจสอบสตริงสำหรับอักขระที่ต้องการได้อย่างไร [ปิด]


182

ฉันจะตรวจสอบได้อย่างไรว่าสตริงมีอักขระเฉพาะหลายตัวในนั้นโดยใช้ Python 2

ตัวอย่างเช่นกำหนดสตริงต่อไปนี้:

อาชญากรขโมยอัญมณี 1,000,000 เหรียญ

ฉันจะตรวจสอบได้อย่างไรว่ามีเครื่องหมายดอลลาร์ ("$") เครื่องหมายจุลภาค (",") และตัวเลข


1
นั่นหมายความว่าตัวละครทุกตัวควรจะเป็นหนึ่งในนั้นหรือพอเพียงว่าตัวละครเหล่านี้ (หรือทั้งหมด) มีอยู่ในสตริงหรือไม่ พวกเขาจะต้องอยู่ในลำดับ (เช่น: $ 2,00) เพราะมันถูกต้อง?
NullUserException

2
เช่นเดียวกับแนวทางที่แตกต่างกันnot set(p).isdisjoint(set("0123456789$,"))ซึ่งpเป็นสตริงที่จะทดสอบ
Kevin

คำตอบ:


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
@akki ไม่พบคือ -1 เนื่องจาก 0 เป็นดัชนีของอักขระตัวแรกในสตริง ดังนั้น "abc" .find ('a') = 0 มันจะคลุมเครือถ้า 0 ก็เป็นค่าที่ไม่พบเช่นกัน
lemiant

1
any()ฉันชอบที่รุ่นสุดท้ายที่ใช้ มีวิธีการอ้างถึงตัวละครที่พบcในสไตล์ pythonic (ดูเหมือนว่าจะมีการกำหนดขอบเขตภายในany()เท่านั้น) หรือฉันจะต้องค้นหาอักขระหลายตัวให้ชัดเจนยิ่งขึ้นหรือไม่?
Jens

3
ตัวอย่างที่สองใช้งานไม่ได้: regex ต้องมีวงเล็บ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 () และใช้ได้ดีตราบใดที่จำนวนอักขระที่ค้นหาต่ำ ไม่จำเป็นต้องใช้วงเล็บ
ฌอน

1
@ Sean เกี่ยวกับ parenthenses: ฉันรู้ว่ามันง่ายกว่าที่ฉันจะใช้มันเสมอกว่าจะจำลำดับที่มาก่อน :-)
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 - สำหรับสตริงยาวถ้า - แล้วยังเร็วกว่าใด ๆ !

ฉันตัดสินใจที่จะเปรียบเทียบเวลาสำหรับสตริงแบบสุ่มที่มีความยาวโดยพิจารณาจากคะแนนที่ถูกต้องในความคิดเห็น:

# 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

@ Josh อาจเป็นเพราะมันง่ายกว่า Func1 ใช้ความเข้าใจรายการที่ถูกระเบิดดังนั้นมันจึงซับซ้อนโดยอัตโนมัติสำหรับสิ่งที่ง่าย แต่สำหรับ 1,000 ตัวอักษรมันอาจจะเร็วกว่าที่จะใช้ Func1
Hack5

@ Hack5 สมมติว่าphraseสตริงที่มีตัวอักษรจาก A ถึง Z และฉันต้องการที่จะพิมพ์ตัวอักษรที่ไม่ได้อยู่ด้วยกันสตริงจะใช้any()ดีกว่าหรือไม่ หรือมีวิธีตรวจสอบสั้น ๆ
Avishek Datta Ray

@ Barefaced Bare ที่ระดับนั้นเลือกสิ่งที่ดูดีกว่า ความเร็วอาจไม่สำคัญเว้นแต่คุณจะควบคุมนิวเคลียร์ (ซึ่งในกรณีนี้คุณไม่ควรใช้ไพ ธ อน)
Hack5

5

วิธีนี้จะทดสอบว่าสายอักขระประกอบขึ้นจากชุดค่าผสมหรือตัวเลขเครื่องหมายดอลลาร์และเครื่องหมายจุลภาค นั่นคือสิ่งที่คุณกำลังมองหา?

นำเข้าอีกครั้ง

s1 = 'การทดสอบสตริง'
s2 = '1234,12345 $'

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

ถ้า (regex.match (s1)):
   พิมพ์ "s1 ที่ตรงกัน"
อื่น:
   พิมพ์ "s1 ไม่ตรงกัน"

ถ้า (regex.match (s2)):
   พิมพ์ "s2 ที่ตรงกัน"
อื่น:
   พิมพ์ "s2 ไม่ตรงกัน"

คุณไม่จำเป็นต้องหลบหนี $ หากอยู่ในคลาสตัวละคร นอกจากนี้ยังจะจับคู่'testing $tring'ซึ่งฉันไม่คิดว่าเป็นสิ่งที่ 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")   

อย่างอื่น:
พิมพ์ ("อักขระพิเศษที่ไม่ว่าง")


1
คุณช่วยอธิบายบริบทของคำตอบของคุณให้มากขึ้นได้ไหม
ลิงทองเหลือง

การตรวจสอบประเภทของอักขระที่มีอยู่ในสตริง: isalnum (): ส่งคืนค่า True หากอักขระทั้งหมดเป็นตัวอักษรและตัวเลข (a ถึง z, A ถึง Z, 0 to9) isalpha (): ส่งคืนค่า True ถ้าอักขระทั้งหมดเป็นสัญลักษณ์ตัวอักษรเท่านั้น (a ถึง z, A ถึง Z), isdigit (): ส่งคืนค่า True ถ้าตัวละครทั้งหมดเป็นตัวเลขเท่านั้น (0 ถึง 9) islower (): ส่งคืนค่า True หากตัวละครทั้งหมดเป็นสัญลักษณ์ตัวอักษรตัวพิมพ์เล็กกรณี (isupper (): ส่งคืน True ถ้าตัวละครทั้งหมดเป็นตัวพิมพ์ใหญ่ istitle (): ผลตอบแทนจริงถ้าสตริงอยู่ในชื่อเรื่องกรณี isspace (): ผลตอบแทนจริงถ้าสตริงมีช่องว่างเท่านั้น @LazerBass
Nagaraj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.