Я использую следующий код для очистки моего текста
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()
Как вы можете видеть, я удаляю круглые скобки и другие специальные символы. Теперь я хочу сохранить следующие шаблоны в тексте и не удалять их
:), :-), :( а также :-(
Может ли кто-нибудь помочь мне с этим, пожалуйста?
Спасибо,
Вы должны спросить себя, какие шаблоны соответствуют любым символам из смайликов, которые вы хотите "защитить". Вы легко можете видеть, что 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)*
).
:
и-
к классу в первомre.sub
. Не забудьте поставить-
в конце скобок, иначе он определяет диапазон.