Найти - Пользователи
Полная версия: как удалить из строки все небуквенные и нечисловые символы?
Начало » Python для новичков » как удалить из строки все небуквенные и нечисловые символы?
1 2
gtlhbkkj
всем привет
существует ли какой-то более простой и быстрый способ кроме ISALNUM() в цикле?

 k = "asd&1 %/(KH-092 D?X"
x = ""
for m in k:
    if m.isalnum(): x = x + m
print(x)

у меня строки длинные и их много
vic57
через регулярки можно
 >>> import re
>>> k = "asd&1 %/(KH-092 D?X"
>>> re.sub(r'[^a-zA-Z0-9]+','',k)
'asd1KH092DX'
если строк много, то можно скомпилировать шаблон сначала
 >>> patt = re.compile('[^a-zA-Z0-9]+')
>>> re.sub(patt,'',k)
'asd1KH092DX'
gtlhbkkj
vic57
через регулярки можно
спасибо
ваш вариант исполняется на 20% дольше )))
всё равно благодарю
не знал что так можно
py.user.next
Быстрый не быстрый, а твой цикл не по-питоновски сделан
  
>>> s = 'asd&1 %/(KH-092 D?X'
>>> ''.join(filter(str.isalnum, s))
'asd1KH092DX'
>>>
gtlhbkkj
py.user.next
Быстрый не быстрый, а твой цикл не по-питоновски сделан
благодарю
ваш вариант на 15% быстрее моего
vic57
gtlhbkkj
ваш вариант исполняется на 20% дольше )))
можно С/С++ применить, но кодировка должна быть однобайтовой типа cp1251
//find_ascii.c
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {

const char* arr = argv[1];
for (int i = 0; i < strlen(arr); i ++) {
unsigned int tmp = arr[i];
if ((tmp > 47 && tmp < 58) || (tmp > 64 && tmp < 91) || (tmp > 96 && tmp < 123 ) || (tmp > 191)) {
fprintf(stdout,"%c",tmp);
}
}
fprintf(stdout,"\n");
}
 from subprocess import run,PIPE
s = 'asd&1 %/(KH-092 D?X'
cmd = ["./find_ascii",s.encode('cp1251')]
p = run(cmd,stdout=PIPE)
print (p.stdout.decode('cp1251'))
gtlhbkkj
vic57
можно С/С++ применить, но кодировка должна быть однобайтовой типа cp1251
спасибо и на том
я ни в питоне, ни в С++ и ни в чем другом ни бум бум к сожалению. Разбираться не имею времени к сожалению. Питон интуитивно в несколько раз проще С/С++, буду придерживаться его.
Мне в принципе подойдет любое рабочее решение на питоне, даже не самое оптимальное по времени.
py.user.next
vic57
можно С/С++ применить
Код ужасный, конечно, во всех смыслах. Там в C89 есть функция isalnum(), декларируется она в ctype.h .

vic57
fprintf(stdout,"%c",tmp);
putchar(tmp);
vic57
py.user.next
Там в C89 есть функция isalnum(), декларируется она в ctype.h .
посмотри ctypes и увидишь что она именно коды символов анализирует и только для ascii
http://cppstudio.com/cat/309/313/
py.user.next
Код ужасный, конечно, во всех смысла
мне твое мнение неинтересно от слова совсем, прохвессор
py.user.next
vic57
посмотри ctypes и увидишь что она именно коды символов анализирует и только для ascii
Там и для Юникода функция есть. Просто ты в C полный ноль, если вообще не отрицательное число.

vic57
мне твое мнение неинтересно от слова совсем, прохвессор
Это оттого, что ты прилюдно обосрался, когда захотел сумничать.

vic57
//find_ascii.c
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {

const char* arr = argv[1];
for (int i = 0; i < strlen(arr); i ++) {
unsigned int tmp = arr[i];
if ((tmp > 47 && tmp < 58) || (tmp > 64 && tmp < 91) || (tmp > 96 && tmp < 123 ) || (tmp > 191)) {
fprintf(stdout,"%c",tmp);
}
}
fprintf(stdout,"\n");
}
Это говнокодище.
В частности strlen() возвращает значение типа size_t (большое и беззнаковое), а i может принимать значения, допустимые для short int (тип int не определён точно по стандарту языка C89 и может становиться где-то short int, а где-то long int). При довольно не длинном массиве твой цикл начнёт обращаться к отрицательным элементам массива и там будет обращение к
arr[-1], arr[-2]
и так далее.
В итоге на такой немножко длинной строке твоя программа начнёт выводить на экран данные из участка памяти, не принадлежащего arr.

Ну, и если в целом судить, материалы, по которым ты учился, тоже написал какой-то придурок, иначе ты бы не выдал такую ахинею, где нет даже return у main().
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB