Hoe controleer ik een string op specifieke karakters?

Hoe kan ik met Python 2 controleren of een string meerdere specifieke tekens bevat?

Bijvoorbeeld, gegeven de volgende tekenreeks:

De criminelen stalen $ 1.000.000 aan juwelen.

Hoe kan ik zien of het dollartekens (“$”), komma’s (“,”) en cijfers heeft?


Antwoord 1, autoriteit 100%

Ervan uitgaande dat uw string sis:

'$' 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

En zo verder voor andere personages.

… of

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

… of

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

[Bewerken: de '$' in santwoorden toegevoegd]


Antwoord 2, autoriteit 9%

gebruiker Jochen Ritzel zei dit in een reactie op een antwoord op deze vraag van gebruiker dappawit.
Het zou moeten werken:

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

‘1’, ‘2’, enz. moeten worden vervangen door de tekens die u zoekt.

Zie deze pagina in de Python 2.7-documentatievoor wat informatie over strings, inclusief over het gebruik van de in-operator voor substringtests.

Update:dit doet hetzelfde werk als mijn bovenstaande suggestie met minder herhaling:

# 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

Antwoord 3, autoriteit 4%

Snelle vergelijking van tijdstippen als reactie op het bericht van Abafei:

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

Uitvoer:

Func1 Time: 0.0737484362111
Func2 Time: 0.0125144964371

Dus de code is compacter met elke, maar sneller met de voorwaardelijke.


EDIT :TL;DR— Voor lange strings is if-then nog steedsveel sneller dan ieder!

Ik besloot de timing voor een lange willekeurige reeks te vergelijken op basis van enkele van de geldige punten die in de opmerkingen naar voren werden gebracht:

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

Uitgang:

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

Als-dan is bijna een orde van grootte sneller dan wie dan ook!


Antwoord 4, Autoriteit 2%

Dit zal testen of de snaren zijn samengesteld uit een aantal combinatie of cijfers, het dollarteken en een komma’s. Is dat wat je zoekt?

import re
S1 = 'teststring'
S2 = '123412345 $'
RGEX = Re.compile ('[0-9, $] + $')
if (regex.match (S1)):
  Print "S1 Matched"
anders:
  Print "S1 kwam niet overeen"
if (regex.match (S2)):
  Print "S2 matched"
anders:
  Print "S2 kwam niet overeen"

Antwoord 5

Mijn eenvoudige, eenvoudige, eenvoudige aanpak! = D

code

string_to_test = "The criminals stole $1,000,000 in jewels."
chars_to_check = ["$", ",", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
for char in chars_to_check:
    if char in string_to_test:
        print("Char \"" + char + "\" detected!")

Uitvoer

Char "$" detected!
Char "," detected!
Char "0" detected!
Char "1" detected!

Bedankt!


Antwoord 6

Controleer of tekens in String staan:

parse_string = lambda chars, string: [char in string for char in chars]

voorbeeld:

parse_string('axl', 'hello') 

of

parse_string(['a', 'x', 'l'], 'hello')

uitvoer: [False, False, True]


Antwoord 7

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

anders:
print(“Geen spatie speciaal teken”)

Other episodes