Python3 regex: оставь немного Emojis, откажись от остальных - PullRequest
1 голос
/ 13 марта 2019

нуб тут. У меня есть строки, в которых я хочу оставить немного смайликов и отказаться от всего остального.

INPUT:

Эта книга такая смешная❤️. Эта книга ? бомба (как в лучшем В МИРЕ ? ??) Я люблю ? ? ? это! Я определенно рекомендую это! '

желаемый выход:

Эта книга такая смешная❤️. Эта книга - бомба (КАК В ЛУЧШЕМ В МИРЕ) Я люблю ? ? ? это! Я определенно рекомендую это! '

У меня есть соответствующий re.compile:

Я не знаю, как собрать это в re.compile, который исключает одно из другого. Или оставьте буквенно-цифровые символы, знаки препинания и мои смайлики, а остальное замените на "".

mytext = This book is so funny❤️. This book ? is the bomb(AS IN THE BEST 
IN THE WORLD ? ?? )I love ? ? ? it!I definitely recommend it!'
# Desired out put:
# u'This book is so funny❤️. This book is the bomb(AS IN THE BEST 
IN THE WORLD )I love ? ? ? it!I definitely recommend it!'
print ("Original text:")
print (mytext, "\n")

# Strip out emoticon modifiers, leaving a simplified emoticon to work with.
# https://en.wikipedia.org/wiki/Variation_Selectors_(Unicode_block)
# https://en.wikipedia.org/wiki/Variation_Selectors_Supplement
Emoji_Modifiers = re.compile(u'([\U0000FE00-\U0000FE0F])|([\U000E0100-\U000E0100])')
mytext_mod_gone = Emoji_Modifiers.sub(r'', mytext) 
print ("Modifiers Removed:")
print (mytext_mod_gone, "\n")

# All emoticons    
find_regex      = re.compile(u'([\U00002600-\U000027BF])|([\U0001f300-\U0001f64F])|([\U0001f680-\U0001f6FF])')
# Heart emoticons
#find_regex     = re.compile(u"([\U00002619])|([\U00002661])|([\U00002665])|([\U00002763])|([\U00002764])|([\U00002765])|([\U00002766])|([\U00002767])|([\U00002E96])|([\U00002E97])|([\U00002F3C])|([\U0001F394])|([\U0001F48C])|([\U0001F48F])|([\U0001F491])|([\U0001F493])|([\U0001F494])|([\U0001F495])|([\U0001F496])|([\U0001F497])|([\U0001F498])|([\U0001F499])|([\U0001F49A])|([\U0001F49B])|([\U0001F49C])|([\U0001F49D])|([\U0001F49E])|([\U0001F49F])|([\U0001F4D6])|([\U0001F5A4])|([\U0001F60D])|([\U0001F618])|([\U0001F63B])|([\U0001F970])|([\U0001F9E1])")
# Alphanumeric + punctuation for an alternative solution
#find_regex     = re.compile(r"[^a-zA-Z0-9!,.?!#&'()*+,-./:;<=>?@\^_`{|}~\s]") # 

mytext_emoji_gone = find_regex.sub(r'', mytext)

Я падаю в:

  • Отрицательный Unicode с отрицательным взглядом сзади (?<!...). Я недостаточно хорошо понимаю операнды, и regex101.com работает только с r ', а не с u.
  • Объединение нескольких регулярных выражений в re.compile. Скажите, что если я хочу сохранить алфавитно-цифровую форму и мои эмодзи, он жалуется, когда я делаю re.compile(u'(\Uxxxx)' | r'(regex)' ). неподдерживаемые типы операндов для |: 'str' и 'str', поэтому оператор типа OR здесь не работает ... и OR дает нежелательные результаты.

Могу ли я получить помощь по любому из них:

  • Игнорирование подмножества смайликов и удаление остальных (мое предпочтительное решение)
  • Сохранение (буквенно-цифровые, пунктуация и мои смайлики) и удаление остальных.
  • Конкретный вопрос: можете ли вы «складывать» re.compiles? IE создает 2 разных re.compiles, чтобы соответствовать (или не совпадать) вещам, а затем объединить их.

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Я пошел с:

find_regex     = re.compile(u"(?![\U00002619])(?![\U00002661])(?![\U00002665])(?![\U00002763])(?![\U00002764])(?![\U00002765])(?![\U00002766])(?![\U00002767])(?![\U00002E96])(?![\U00002E97])(?![\U00002F3C])(?![\U0001F394])(?![\U0001F48C])(?![\U0001F48F])(?![\U0001F491])(?![\U0001F493])(?![\U0001F494])(?![\U0001F495])(?![\U0001F496])(?![\U0001F497])(?![\U0001F498])(?![\U0001F499])(?![\U0001F49A])(?![\U0001F49B])(?![\U0001F49C])(?![\U0001F49D])(?![\U0001F49E])(?![\U0001F49F])(?![\U0001F4D6])(?![\U0001F5A4])(?![\U0001F60D])(?![\U0001F618])(?![\U0001F63B])(?![\U0001F970])(?![\U0001F9E1])"r"[^a-zA-Z0-9!,.?!#&'()*+,-./:;<=>?@\^_`{|}~\s]")

mytext_emoji_gone = find_regex.sub(r'', mytext)

, который лишил всех остальных смайликов, оставив только смайлики сердца и книги, а также буквенно-цифровые и знаки препинания.

Как часть моего первоначального вопроса, есть ли способ сложить их? В настоящее время это огромная длинная строка кода. Можем ли мы сделать что-то вроде:

regex = re.compile(a)
regex += re.compile(b)

Это будет использовать реальную недвижимость, но у меня все в порядке

1 голос
/ 13 марта 2019

regex101 имеет опцию Unicode, это флаг, который вы можете включить с правой стороны поля регулярных выражений.

Я думаю, что проще всего найти все смайлики в строке, кроме тех, которые вы хотите сохранить, и заменить их пустой строкой, как вы и хотели. Чтобы сделать это, вы можете использовать регулярное выражение, которое найдет любые эмодзи (для этого примера я буду использовать [\U00010000-\U0010ffff], но я уверен, что есть лучшие, так что используйте один из них) и добавьте отрицательный взгляд вперед, чтобы игнорировать смайлики, которые ты хочешь оставить.

Финальное регулярное выражение должно выглядеть примерно так: this :

(?![\u2764])[\U00010000-\U0010ffff]

Первая часть (?![\u2764]) убедится, что матч не является смайликом, который вы хотите сохранить, а вторая часть [\U00010000-\U0010ffff] убедится, что это смайлик

Вы можете добавить все остальные смайлики, которые хотите оставить в квадратных скобках (?![\u2764 здесь ])

...