2016-09-08 4 views
0

Это моя строка:Python регулярное выражение замены u2022

raw_list = u'Software Engineer with a huge passion for new and innovative products. Experienced gained from working in both big and fast-growing start-ups. Specialties \u2022 Languages and Frameworks: JavaScript (Nodejs, React), Android, Ruby on Rails 4, iOS (Swift) \u2022 Databases: Mongodb, Postgresql, MySQL, Redis \u2022 Testing Frameworks: Mocha, Rspec xxxx Others: Sphinx, MemCached, Chef.' 

Я пытаюсь заменить \u2022 только с пространством.

x=re.sub(r'\u2022', ' ', raw_list) 

Но это не работает. Что я делаю не так?

+1

Вам не нужно использовать 'модуль re', чтобы сделать это. Просто используйте метод '.replace()' ваших строк в Юникоде. – reynoldsnlp

ответ

5

Вы используете сырые строки, с r. Это говорит Python интерпретировать строку буквально, вместо того, чтобы фактически брать экранированные символы (такие как \ n).

>>> r'\u2022' 
'\\u2022' 

Вы можете видеть, что это на самом деле двойная обратная косая черта. Вместо этого вы хотите использовать >>>u'\u2022', а затем он будет работать.

Обратите внимание, что поскольку вы делаете простую замену вы можете просто использовать str.replace метод:

x = raw_list.replace(u'\u2022', ' ') 

Вам нужны только регулярное выражение заменить для сложного сопоставления с образцом.

+0

ahh ok, спасибо! –

+1

Обратите внимание, что модуль 're' действительно интерпретирует ** большинство ** строк escape-последовательностей, поддерживаемых Python. '\ uhhhh' просто оказывается тем, что * не поддерживается *. Вы все равно можете использовать строковый литерал, просто добавив 'u' спереди, чтобы он интерпретировал escape-последовательности Unicode. –

1

Если вы не используете Юникод строковый литерал, то escape-последовательность \uhhhh не имеет значения. Не для Python, а не для модуля re. Добавьте u префикс:

re.sub(ur'\u2022', ' ', raw_list) 

Обратите внимание на ur там; это строковый литерал строки unicode; это все еще интерпретирует escape-последовательности unicode \uhhhh (но в остальном идентично стандартным режимам строкового литерала). Модуль re не поддерживает такие escape-последовательности сам (но он поддерживает большинство других escape-последовательностей строки Python).

Не то, что вам нужно использовать регулярное выражение здесь, простой unicode.replace() будет достаточно:

raw_list.replace(u'\u2022', u' ') 

или вы можете использовать unicode.translate():

raw_list.translate({0x2022: u' '}) 
+0

"это все еще интерпретирует escape-последовательности unixode' \ uhhh' '- ничего себе, я не ожидал, что так будет. Я не знаю, почему они сделали бы это так. Похоже, они [полностью удалили 'ur' в Python 3.3] (http://bugs.python.org/issue15096), чтобы избежать вопроса о том, действительно ли' ur' должен быть сырым или только-несколько-сырым, как Python 2 – user2357112

+0

@ user2357112: вам не нужно 'ur '...'' в Python 3, потому что a) 'r '...'' уже является строкой unicode (так как строки всегда являются строками Unicode в Python 3) и b) модуль 're' действительно поддерживает последовательности' \ uhhhh' в Python 3. –

1

Это мой подход, изменение регулярных выражений шаблона, вы можете попробовать

re.sub(r'[^\x00-\x7F]+','',raw_list) 

Out [1]: u'Software инженер с огромной страстью к новому и инновационных продуктам. Опытный получил опыт работы в крупных и быстрорастущих стартапах. Особенности Языки и рамки: JavaScript (Nodejs, React), Android, Ruby on Rails 4, iOS (Swift) Базы данных: Mongodb, Postgresql, MySQL, Redis Тестирование: Mocha, Rspec xxxx Прочее: Sphinx, MemCached, Chef. '

0

Ключа добавить Юникод u перед Юникодом символа, который вы пытаетесь найти - в этом случае \u2022 который является юникод символами для пули. Если ваш текст содержит символы юникода, ваш текст на самом деле является текстом в формате unicode, а не строкой (вы можете подтвердить, распечатав свой текст и ищите u в начале).Смотрите пример ниже, где искать для юникода символа маркера, используя регулярные выражения (RegEx) на обоих струнной и юникод текст в:

импорта регулярных выражений пакета:
import re 
юникод текст:
my_unicode = u"""\u2022 Here\'s a string of data.\n<br/>\u2022 There are new 
line characters \n, HTML line break tags <br/>, and bullets \u2002 together in 
a sequence.\n<br/>\u2022 Our goal is to use RegEx to identify the sequences.""" 

type(my_unicode) #unicode 
строка:
my_string = """\u2022 Here\'s a string of data. \n<br/>\u2022There are new 
line characters \n, HTML line break tags <br/>, and bullets \u2002 together in 
a sequence.\n<br/>\u2022 Our goal is to use RegEx to identify the sequences.""" 

type(my_string)  #string 
мы успешно найти первый кусок текста, который мы ищем, которые еще не содержат символы Юникода:
re.findall('\n<br/>', my_unicode) 

re.findall('\n<br/>', my_string) 
с добавлением юникода характера, ни последовательность может можно найти:
re.findall('\n<br/>\u2022', my_unicode) 

re.findall('\n<br/>\u2022', my_string) 
Добавление четыре обратных слэша работает для строки, но она не работает текст Юникода:
re.findall('\n<br/>\\\\u', my_unicode) 

re.findall('\n<br/>\\\\u', my_string) 
Решение: Включите Юникод u перед юникодом характера:
re.findall('\n<br/>' u'\u2022', my_unicode) 
Смежные вопросы