Як перевірити рядок для конкретних символів? [зачинено]


182

Як я можу перевірити, чи в рядку є кілька конкретних символів, використовуючи Python 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:-)
Йохен Рітцель

Чи є якась конкретна причина, чому значення на не знайдено зберігалося -1, а не 0 ??
akki

2
@akki не знайдено - -1, оскільки 0 - це індекс першого символу в рядку. Таким чином, "abc" .find ('a') = 0. Було б неоднозначно, якби 0 також було не знайденим значенням.
леміант

1
Мені подобається ця остання версія, що використовує any(). Чи є спосіб cпозначити знайденого персонажа в пітонічному стилі (він, здається, зафіксований всередині any()), або мені потрібно зробити пошук декількох символів більш явним?
Єнс

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 (), і добре, доки кількість шуканих символів буде невеликою. Дуже не потрібні дужки.
Шон

1
@Sean Про дужки: Я знаю, однак мені легше завжди їх використовувати, ніж завжди пам'ятати порядок пріоритету :-).
Аббафей

11

Швидке порівняння термінів у відповідь на повідомлення Аббафея:

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

Таким чином код є більш компактним з будь-яким, але швидшим із умовним.


EDIT: 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
саме те, що я хотів знати :-)
Ларс

1
Хтось може пояснити, чому умовне - це набагато швидше, ніж використання будь-якого?
Джош

@Josh, мабуть, це тому, що це простіше. Func1 використовує розуміння списків розгорнутого списку, тому його автоматично відстежують складнішими для простих речей. Але на 1000 знаків, можливо, буде швидше використовувати Func1
Hack5

@ Hack5, припустимо, phraseрядок з алфавітами від A до Z, і я хочу надрукувати, які алфавіти відсутні в разом рядку, буде використовувати any()краще? чи є якийсь короткий спосіб перевірити?
Авішек Датта Рей

@Barefaced Bare на такому рівні, вибирай те, що виглядає приємніше. Швидкість, мабуть, не має значення, якщо ви не
керуєте ядерними ядрами

5

Це дозволить перевірити, чи рядки складаються з комбінації чи цифр, знака долара та коми. Це те, що ви шукаєте?

імпорт ре

s1 = 'Рядок тестування'
s2 = '1234,12345 $'

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

якщо (regex.match (s1)):
   print "s1 збігається"
ще:
   print "s1 не відповідав"

якщо (regex.match (s2)):
   print "s2 збігається"
ще:
   print "s2 не відповідав"

Вам не доведеться уникати $, якщо він знаходиться в класі символів. Також це буде відповідати 'testing $tring', що я не думаю, що ОП хоче цього статися.
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 (): Повертає значення True, якщо всі символи буквено-цифрові (від a до z, від A до Z, від 0 до 9) isalpha (): Повертає значення True, якщо всі символи є лише символами алфавіту (a до z, Від A до Z), isdigit (): Повертає значення True, якщо всі символи є лише цифрами (від 0 до 9). istitle (): Повертає True , якщо рядок в заголовку справи isspace (): Повертає True , якщо рядок містить тільки прогалини @LazerBass
Нагараджа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.