Удаление не алфавитно-цифровых символов из строки в Python, но с сохранением специальных символов - PullRequest
4 голосов
/ 09 июля 2011

Я знаю, что подобные вопросы задавались здесь, на StackOverflow.Я попытался адаптировать некоторые подходы, но не смог заставить работать что-то, что соответствовало бы моим потребностям:

Учитывая строку питона Я хочу убрать все не алфавитно-цифровые символы - но - оставляя любой особый характер, такой как µ æ Å Ç ß ... Возможно ли это вообще?с помощью регулярных выражений я попробовал варианты этого

re.sub(r'[^a-zA-Z0-9: ]', '', x) # x is my string to sanitize

, но это лишает меня больше, чем я хочу.Вот пример того, что я хочу:

Input:  "A string, with characters µ, æ, Å, Ç, ß,... Some    whitespace  confusion  ?"
Output: "A string with characters µ æ Å Ç ß Some whitespace confusion"

Возможно ли это даже без усложнения?

Ответы [ 4 ]

3 голосов
/ 09 июля 2011

Исключение символов в категории " Знаки пунктуации, другие ". Юникод.

# -*- coding: utf-8 -*-

import unicodedata

# This removes punctuation characters.
def strip_po(s):
  return ''.join(x for x in s if unicodedata.category(x) != 'Po')

# This reduces multiple whitespace characters into a single space.
def fix_space(s):
  return ' '.join(s.split())

s = u'A string, with characters µ, æ, Å, Ç, ß,... Some    whitespace  confusion  ?'
print fix_space(strip_po(s))
3 голосов
/ 09 июля 2011

Используйте \ w с установленным флагом UNICODE. Это также будет соответствовать подчеркиванию, поэтому вам, возможно, придется позаботиться об этом отдельно.

Подробнее о http://docs.python.org/library/re.html.

РЕДАКТИРОВАТЬ: Вот некоторые фактический код. В нем будут храниться буквы Unicode, цифры Unicode и пробелы.

import re
x = u'$a_bßπ7: ^^@p'
pattern = re.compile(r'[^\w\s]', re.U)
re.sub(r'_', '', re.sub(pattern, '', x))

Если бы вы не использовали re.U, символы ß и π были бы удалены.

Извините, я не могу найти способ сделать это с одним регулярным выражением. Если вы можете, вы можете опубликовать решение?

1 голос
/ 22 ноября 2012

Если вы согласны с классификацией Консорциума Unicode, которая представляет собой букву или цифру, простой способ сделать это без RegEx или импортировать что-либо вне встроенного:str вместо unicode, вам нужно сначала его кодировать.

1 голос
/ 09 июля 2011

Вам нужно лучше определить, что вы подразумеваете под специальными символами.Существуют определенные флаги, которые группируют такие вещи, как пробелы, непробелы, цифры и т. Д., И делают это в зависимости от локали.Для получения дополнительной информации см. http://docs.python.org/library/re.html.

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

...