Какая реализация на чистом Python лучше всего проверяет, содержит ли строка ЛЮБЫЕ буквы из алфавита?
string_1 = "(555).555-5555"
string_2 = "(555) 555 - 5555 ext. 5555
Куда string_1
вернется False
за то, что в нем нет букв алфавита, и string_2
вернется True
за то, что имеет букву.
Ответы:
Regex должен быть быстрым:
re.search('[a-zA-Z]', the_string)
источник
any(c.isalpha() for c in string_1)
восхитительно питонический.isalpha
даже означает? Это будет иметь совершенно другое поведение при сравнении Python 2 с Python 3. Является ли китайский частью алфавита? Если нет, вы слепо сопоставляете его со своим генератором на Python 3 (или Python 2 для строк в Юникоде!). Если вы хотите вещий , вот это:Simple is better than complex.
. И проверьте комментарий OP выше: он хочет, чтобы совпадал только латинский алфавит.Match
объект, если есть совпадение, илиNone
если его нет. Итак, это совместимо сif re.search(...
шаблоном.Как насчет:
>>> string_1 = "(555).555-5555" >>> string_2 = "(555) 555 - 5555 ext. 5555" >>> any(c.isalpha() for c in string_1) False >>> any(c.isalpha() for c in string_2) True
источник
set(string_1)
бы эффективнее?set
может уменьшить или не уменьшить количество вызовов функций, но добавляет некоторые накладные расходы.Вы можете использовать
islower()
в своей строке, чтобы увидеть, содержит ли она строчные буквы (среди других символов).or
это с,isupper()
чтобы также проверить, содержит ли некоторые буквы верхнего регистра:ниже: буквы в строке: тест дает true
>>> z = "(555) 555 - 5555 ext. 5555" >>> z.isupper() or z.islower() True
ниже: в строке нет букв: тест дает ложь.
>>> z= "(555).555-5555" >>> z.isupper() or z.islower() False >>>
Не путать с тем,
isalpha()
что возвращается,True
только если все символы являются буквами, а это не то, что вам нужно.Обратите внимание, что ответ Барма прекрасно дополняет мой, поскольку мой не обрабатывает смешанный случай.
источник
Мне понравился ответ @ jean-françois-fabre , но он неполный.
Его подход будет работать, но только если текст содержит только строчные или прописные буквы:
>>> text = "(555).555-5555 extA. 5555" >>> text.islower() False >>> text.isupper() False
Лучше всего сначала ввести строку в верхний или нижний регистр, а затем проверить.
>>> string1 = "(555).555-5555 extA. 5555" >>> string2 = '555 (234) - 123.32 21' >>> string1.upper().isupper() True >>> string2.upper().isupper() False
источник
Вы можете использовать такое регулярное выражение:
import re print re.search('[a-zA-Z]+',string)
источник
Я протестировал каждый из вышеперечисленных методов, чтобы определить, содержатся ли какие-либо алфавиты в данной строке, и выяснил среднее время обработки каждой строки на стандартном компьютере.
~ 250 нс для
import re
~ 3 мкс для
re.search('[a-zA-Z]', string)
~ 6 мкс для
any(c.isalpha() for c in string)
~ 850 нс для
В отличие от заявленного, импорт re занимает незначительное время, а поиск с помощью re занимает примерно половину времени по сравнению с повторением isalpha () даже для относительно небольшой строки.
Следовательно, для больших строк и большего количества счетчиков re будет значительно более эффективным.
Но здесь выигрывает преобразование строки в регистр и проверка регистра (то есть любой из upper (). Isupper () или lower (). Islower () ) . В каждом цикле он значительно быстрее, чем re.search (), и даже не требует дополнительного импорта.
источник
Вы также можете сделать это дополнительно
import re string='24234ww' val = re.search('[a-zA-Z]+',string) val[0].isalpha() # returns True if the variable is an alphabet print(val[0]) # this will print the first instance of the matching value
Также обратите внимание, что если переменная val возвращает None. Это означает, что поиск не нашел совпадения
источник