Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 6, 2019 15:08:53

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

как удалить из строки все небуквенные и нечисловые символы?

всем привет
существует ли какой-то более простой и быстрый способ кроме ISALNUM() в цикле?

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

у меня строки длинные и их много

Отредактировано gtlhbkkj (Окт. 6, 2019 15:10:06)

Офлайн

#2 Окт. 6, 2019 16:24:14

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

как удалить из строки все небуквенные и нечисловые символы?

через регулярки можно

 >>> 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'

Отредактировано vic57 (Окт. 6, 2019 16:44:23)

Офлайн

#3 Окт. 6, 2019 16:53:30

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

как удалить из строки все небуквенные и нечисловые символы?

vic57
через регулярки можно
спасибо
ваш вариант исполняется на 20% дольше )))
всё равно благодарю
не знал что так можно

Офлайн

#4 Окт. 6, 2019 17:00:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

как удалить из строки все небуквенные и нечисловые символы?

Быстрый не быстрый, а твой цикл не по-питоновски сделан

  
>>> s = 'asd&1 %/(KH-092 D?X'
>>> ''.join(filter(str.isalnum, s))
'asd1KH092DX'
>>>



Офлайн

#5 Окт. 6, 2019 17:09:56

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

как удалить из строки все небуквенные и нечисловые символы?

py.user.next
Быстрый не быстрый, а твой цикл не по-питоновски сделан
благодарю
ваш вариант на 15% быстрее моего

Офлайн

#6 Окт. 6, 2019 19:58:50

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

как удалить из строки все небуквенные и нечисловые символы?

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'))

Офлайн

#7 Окт. 7, 2019 00:19:46

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

как удалить из строки все небуквенные и нечисловые символы?

vic57
можно С/С++ применить, но кодировка должна быть однобайтовой типа cp1251
спасибо и на том
я ни в питоне, ни в С++ и ни в чем другом ни бум бум к сожалению. Разбираться не имею времени к сожалению. Питон интуитивно в несколько раз проще С/С++, буду придерживаться его.
Мне в принципе подойдет любое рабочее решение на питоне, даже не самое оптимальное по времени.

Отредактировано gtlhbkkj (Окт. 7, 2019 00:20:35)

Офлайн

#8 Окт. 7, 2019 04:28:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

как удалить из строки все небуквенные и нечисловые символы?

vic57
можно С/С++ применить
Код ужасный, конечно, во всех смыслах. Там в C89 есть функция isalnum(), декларируется она в ctype.h .

vic57
fprintf(stdout,"%c",tmp);
putchar(tmp);



Отредактировано py.user.next (Окт. 7, 2019 04:30:20)

Офлайн

#9 Окт. 7, 2019 20:46:06

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

как удалить из строки все небуквенные и нечисловые символы?

py.user.next
Там в C89 есть функция isalnum(), декларируется она в ctype.h .
посмотри ctypes и увидишь что она именно коды символов анализирует и только для ascii
http://cppstudio.com/cat/309/313/
py.user.next
Код ужасный, конечно, во всех смысла
мне твое мнение неинтересно от слова совсем, прохвессор

Офлайн

#10 Окт. 7, 2019 21:32:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

как удалить из строки все небуквенные и нечисловые символы?

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().



Отредактировано py.user.next (Окт. 7, 2019 21:37:50)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version