Je dois vérifier si certains caractères, par exemple [!,:] Sont entre guillemets dans la chaîne, et non en dehors d'eux

The quick "brown!" fox jumps ":over" the lazy dog - valid string
The quick! "brown!" fox jumps ":over" the lazy, dog - invalid string

Comment vérifier cela?

0
Михаил Павлов 7 mars 2016 à 13:41

4 réponses

Meilleure réponse

Avez-vous déjà utilisé des expressions régulières?

Vous pouvez supprimer tous les mots avec des guillemets et rechercher vos jetons.

import re

def all_tokens_quoted(string):
    quoted_words = re.compile('".*?"')
    tokens = re.compile('[!,:]')
    no_quotations = quoted_words.sub('', string)
    if tokens.search(no_quotations):
        return False
    return True

all_tokens_quoted('The quick "brown!" fox jumps ":over" the lazy dog')
>>> True
all_tokens_quoted('The quick! "brown!" fox jumps ":over" the lazy, dog')
>>> False
0
GLaDOS 7 mars 2016 à 10:54

Vous voudrez peut-être vérifier expression régulière, qui est vraiment puissant à ce sujet.

import re

ifvalid = False
chars = ['!', ',', ':']
str1 = 'The quick "brown!" fox jumps ":over" the lazy dog - valid string'

nonquote = re.split('["].+?["]', str1)
quote = re.findall('["].+?["]', str1)

for word in quote:
    for ch in word:
        if ch in chars:
            ifvalid = True

for word in nonquote:
    for ch in word:
        if ch in chars:
            ifvalid = False

if ifvalid:
    print 'valid'
else:
    print 'invalid'
0
Fingal 7 mars 2016 à 11:34
str1 = "The quick \"brown!\" fox jumps \":over\" the lazy dog - valid string"
str1_split = str1.split("\"")
for str in str1_split[1::2]:
    if str.find("!")>0:
        print "Found!"
        break
0
sdg 7 mars 2016 à 11:10

Sans expressions régulières, essayez ceci:

text = 'The quick "brown!" fox jumps ":over" the lazy dog'
text = text.split('"')
quotes = [text[i] for i in range (len(text)) if (i % 2 == 1)]
not_quotes = [text[i] for i in range (len(text)) if (i % 2 == 0)]
print(quotes, not_quotes)

Cela donne la sortie correcte:

['brown!', ':over'] ['The quick ', ' fox jumps ', ' the lazy dog']

Vous pouvez ensuite diviser chacun de ces éléments en une chaîne et voir s'ils contiennent les caractères.

valid = True #assume valid

for not_quote in not_quotes:
    characters = list(not_quote)
    for character in characters:
        if character in ['!',',',':']:
            valid = False

Une validation similaire peut être effectuée sur les chaînes entre guillemets.

0
Rob Murray 7 mars 2016 à 11:11