Проверка текста Python: az и запятая (",") - PullRequest
2 голосов
/ 22 сентября 2010

Мне нужно убедиться, что какой-то текст содержит только строчные буквы a-z и запятую (",").

Каков наилучший способ сделать это в Python?

Ответы [ 7 ]

16 голосов
/ 22 сентября 2010
import re
def matches(s):
    return re.match("^[a-z,]*$", s) is not None

Что дает вам:

>>> matches("tea and cakes")
False
>>> matches("twiddledee,twiddledum")
True

Вы можете немного оптимизировать с re.compile:

import re
matcher = re.compile("^[a-z,]*$")
def matches(s):
    return matcher.match(s) is not None
14 голосов
/ 22 сентября 2010
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

это замедляет лучший случай, но ускоряет худший случай. В общем, вам придется проверить различные возможности по образцу ожидаемого ввода. чем шире образец, тем лучше.

3 голосов
/ 22 сентября 2010
import re

if not re.search('[^a-z\,]', yourString):
    # True: contains only a-z and comma
    # False: contains also something else
1 голос
/ 01 декабря 2010

Просто:

def alllower(s):
    if ',' in s:
        s=s.replace(',','a')
    return s.isalpha() and s.islower()

с наиболее эффективным и простым.

или в одну строку:

lambda s:s.isalpha() or (',' in s and s.replace(',','a').isalpha()) and s.islower()
1 голос
/ 22 сентября 2010

Не уверен, что вы имеете в виду под "содержать", но это должно идти в вашу сторону:

reobj = re.compile(r"[a-z,]+")
match = reobj.search(subject)
if match:
    result = match.group()
else
    result = ""
0 голосов
/ 22 сентября 2010

символов a -z представлены байтами 97 - 122, а ord (char) возвращает значение байта символа.Чтение файла в двоичном формате и сопоставление должно быть достаточным.

f = open("myfile", "rb")
retVal = False
lowerAlphabets = range(97, 123)
try:
    byte = f.read(1)
    while byte != "":
        # Do stuff with byte.
        byte = f.read(1)
        if byte:
            if ord(byte) not in lowerAlphabets:
                retVal = True
                break

finally:
    f.close()
    if retVal:
        print "characters not from a - z"
    else:
        print "characters from a - z"
0 голосов
/ 22 сентября 2010
#!/usr/bin/env python

import string

text = 'aasdfadf$oih,234'

for letter in text:
    if letter not in string.ascii_lowercase and letter != ',':
        print letter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...