import string
allowed = set(string.lowercase + ',')
if set(text) - allowed:
# you know it has forbidden characters
else:
# it doesn't have forbidden characters
Выполнение этого с наборами будет быстрее, чем с циклами for (особенно, если вы хотите проверить более одного текста), и все вместе будет чище, чем регулярные выражения для этой ситуации.
альтернатива, которая может быть быстрее двух подходов, -
allowed = string.lowercase + ','
if not all(letter in allowed for letter in text):
# you know it has forbidden characthers
вот некоторые бессмысленные mtimeit
результаты. one
- выражение генератора, а two
- решение на основе множеств.
$ python -mtimeit -s'import scratch3' 'scratch3.one("asdfas2423452345sdfadf34")'
100000 loops, best of 3: 3.98 usec per loop
$ python -mtimeit -s'import scratch3' 'scratch3.two("asdfas2423452345sdfadf34")'
100000 loops, best of 3: 4.39 usec per loop
$ python -mtimeit -s'import scratch3' 'scratch3.two("asdfasasdfadsfasdfasdfdaf")'
100000 loops, best of 3: 3.51 usec per loop
$ python -mtimeit -s'import scratch3' 'scratch3.one("asdfasasdfadsfasdfasdfdaf")'
100000 loops, best of 3: 7.7 usec per loop
Вы можете видеть, что основанное на наборе множество значительно быстрее, чем выражение генератора с небольшим ожидаемым алфавитом и условиями успеха. выражение генератора быстрее со сбоями, потому что оно может освободиться. Этого вполне ожидаемо, поэтому интересно увидеть цифры, подтверждающие это.
еще одна возможность, о которой я забыл, - это гибридный подход.
not all(letter in allowed for letter in set(text))
$ python -mtimeit -s'import scratch3' 'scratch3.three("asdfasasdfadsfasdfasdfdaf")'
100000 loops, best of 3: 5.06 usec per loop
$ python -mtimeit -s'import scratch3' 'scratch3.three("asdfas2423452345sdfadf34")'
100000 loops, best of 3: 6.71 usec per loop
это замедляет лучший случай, но ускоряет худший случай. В общем, вам придется проверить различные возможности по образцу ожидаемого ввода. чем шире образец, тем лучше.