сохранение смайликов / смайликов при удалении специальных символов с помощью регулярного выражения Python

1

Я использую следующий код для очистки моего текста

def clean_str(s):
"""Clean sentence"""
  s = re.sub(r"[^A-Za-z0-9(),!?\'\']", " ", s)
  s = re.sub(r"\'s", " \'s", s)
  s = re.sub(r"\'ve", " \'ve", s)
  s = re.sub(r"n\'t", " n\'t", s)
  s = re.sub(r"\'re", " \'re", s)
  s = re.sub(r"\'d", " \'d", s)
  s = re.sub(r"\'ll", " \'ll", s)
  s = re.sub(r",", " , ", s)
  s = re.sub(r"!", " ! ", s)
  s = re.sub(r"\(", " ", s)
  s = re.sub(r"\)", " ", s)
  s = re.sub(r"\?", " ? ", s)
  s = re.sub(r"\s{2,}", " ", s)
  s = re.sub(r'\S*(x{2,}|X{2,})\S*',"xxx", s)
  s = re.sub(r'[^\x00-\x7F]+', "", s)
  return s.strip()

Как вы можете видеть, я удаляю круглые скобки и другие специальные символы. Теперь я хочу сохранить следующие шаблоны в тексте и не удалять их

:), :-), :( а также :-(

Может ли кто-нибудь помочь мне с этим, пожалуйста?

Спасибо,

  • 0
    Как минимум, вам нужно добавить : и - к классу в первом re.sub . Не забудьте поставить - в конце скобок, иначе он определяет диапазон.
Теги:
special-characters
text
emoticons

1 ответ

1
Лучший ответ

Вы должны спросить себя, какие шаблоны соответствуют любым символам из смайликов, которые вы хотите "защитить". Вы легко можете видеть, что r"[^A-Za-z0-9(),!?'']", r"\(" и r"\)" соответствуют этим символам.

Таким образом, вы можете исправить эти шаблоны:

s = re.sub(r":-?[()]|([^A-Za-z0-9(),!?''])", lambda x: " " if x.group(1) else x.group(), s) # Match smilies and match and capture what you need to replace
s = re.sub(r"(?<!:)(?<!:-)\(", " ", s) # Prepend (?<!:)(?<!:-) lookbehinds
s = re.sub(r"(?<!:)(?<!:-)\)", " ", s) # Prepend (?<!:)(?<!:-) lookbehinds

:-?[()]|([^A-Za-z0-9(),!?'']) для защиты (:-?[()] Соответствует a : затем необязательный - а затем ( или )) или сопоставляет и фиксирует в Группе 1 любой символ, отличный от того, который определен в отрицательном классе символов. lambda x: " " if x.group(1) else x.group() лямбда реализует логику пользовательской замены в зависимости от группового соответствия: если группа 1 соответствует, происходит замена, иначе смайлик возвращается туда, где он было.

Отрицательные искажения (?<!:)(?<!:-) :) (?<!:)(?<!:-) убедитесь, что ( и ) не совпадают, если они добавлены с : или :-.

Замечание r'\S*(x{2,}|X{2,})\S*' также может соответствовать смайликам, если они приклеены к xx или XX. Тем не менее, исправление этого является сложным, поскольку :( например, смайлики могут быть сопоставлены с \S* если они не находятся в начале не-пробельного фрагмента, поэтому вы можете использовать

s = re.sub(r'(:-[()])|(?:(?!:-?[()])\S)*(?:x{2,}|X{2,})(?:(?!:-?[()])\S)*',"xxx" if x.group(1) else x.group(), s)

Тактика аналогична модели r":-?[()]|([^A-Za-z0-9(),!?''])", Мы сопоставляем и захватываем смайлик, но тогда мы разрешаем только сопоставление такие небелые символы (\S), которые не запускают подстроку смайлика ((?:(?!:-?[()])\S)*).

  • 1
    Спасибо, Виктор! Я изо всех сил пытался понять, как работает код регулярного выражения, но как-то не понимаю. Я до сих пор не понимаю, как ты это сделал, но это работает. :-) (каламбур предназначен)
  • 0
    @ManojAgrawal Я предлагаю перечитать ответ за предложением, и, пожалуйста, задавайте вопросы здесь, в комментариях, если вы не понимаете какую-то конкретную фразу или часть кода. Я покрыл все в ответе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню