Как удалить специальные символы и буквы из строки, прочитанной из текстового файла в Python? - PullRequest
0 голосов
/ 14 июля 2010

Как я могу удалить специальные символы и буквы из строки, считываемой из текстового файла, сохраняя пробелы? Допустим, у нас есть следующее содержимое в файле:

16 `C38 # 26535 2010 4 14 2 7 7 3 8 ^ @ 1 2 15 100 140 30 $ 14 ^] (2003 2! -6 021 0 14! 2 3! 1 0 35454 0 $ ^ @ 0 0 0 "0" 63 194 (56 188 26 27 "24 0 0 10 994! 8 58 0 0 " 0 0 32 47 32767 32767! 1

Вывод в основном должен быть:

16 38 26535 2010 4 14 2 7 7 3 8 1 2 15 100 140 30 14 2003 2 -6 021 0 14 2 3 1 0 35454 0 0 0 0 0 63 194 56 188 26 27 24 0 0 10 994 8 58 0 0 0 0 32 47 32767 32767 1

Какой самый простой способ сделать это?

Ответы [ 4 ]

3 голосов
/ 14 июля 2010
import re

output_string = re.sub(r'[^\d\s-]', '', input_string)

Шаблон [^\d\s-] будет соответствовать всему, что , а не цифре, тире или пробелу - таким образом, замена любого совпадения пустой строкой удалит все, кроме чисел (включая знаки минуса)и пробелы.

1 голос
/ 14 июля 2010

Если вы хотите сохранить только цифры, знаки плюс и минус и все пробелы, простейшим может быть

import re
   ...
line = re.sub(r'[^\d\s+-]+', '', line)

, который гласит «заменить каждую последовательность одного или нескольких нецифровых непробельных символов на ничто».

Быстрее будет translate метод строк, но намного проще в настройке, поэтому, поскольку вы просите "просто", я предлагаю подход re Теперь приготовьтесь к неизбежным воплям re -хаттеров ...; -).

0 голосов
/ 14 июля 2010

LOL @ Регулярный комментарий Алекса ... надеюсь, не слишком много ненавистников. Тем не менее, несмотря на это, хотя они быстрее, потому что они выполняются в C, регулярные выражения - не мой первый выбор ... возможно, я был предвзятым из-за знаменитой цитаты jwz : '' ' люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них есть две проблемы. '' '

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

Что касается проблем, они включают, но не ограничиваются:

  • оставляя последовательные пробелы
  • удаление отрицательных знаков и
  • объединение нескольких чисел

Итог ... какие решения мне нравятся больше всего? Я бы запустил одно из следующего и отладил оттуда:

Для регулярных выражений я выберу:

@ Решение Алекса или @ Мэтта, если я хочу только данные вместо «золотой» строки

Для обработки строк я изменю решение @ Matt следующим образом:

keep = set(string.whitespace+string.digits+'+-')
line = ''.join(x for x in line if x in keep)

Наконец, у @Greg есть хорошая мысль. Без четкой спецификации это только частичные решения.

0 голосов
/ 14 июля 2010
''.join([x for x in s if x in string.digits+string.whitespace])

или, если вы действительно хотите, это список чисел:

import re
re.findall('\d+',s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...