2016-09-16 3 views
5

Мне нужно извлечь текст между числом и смайл в текстеMatch юникода смайликов в питона регулярных выражений

Пример текста:

blah xzuyguhbc ibcbb bqw 2 extract1 ☺️ jbjhcb 6 extract2 bjvcvvv 

выход:

extract1 
extract2 

Регулярное выражение кода который я написал, извлекает текст между двумя номерами, мне нужно изменить часть, где она идентифицирует символы unoode emoji и извлекает текст между ними.

(?<=[\s][\d])(.*?)(?=[\d]) 

Пожалуйста, предложите дружественный метод питона, и мне нужно работать со всеми Emoji это не только один дал в примере

https://regex101.com/r/uT1fM0/1

+0

Вы должны проверить этот стек, чтобы получить регулярное выражение для смайликов http://stackoverflow.com/q/28077049/4639336 – reticentroot

+0

@reticentroot Я не думаю, что он будет работать для смайликов utf8 типа "". – Delgan

+0

@reticentroot Мне нужно это для работы с unicode смайликами. – LeDerp

ответ

2

Поскольку существует много смайликов with different unicode values, вы должны явно указать их в регулярном выражении, или если они находятся в диапазоне spesific вы можете использовать класс символов. В этом случае ваш второй Simbol не является стандартным смайликов, это просто юникода характер, но так как это больше, чем \u263a (Юникод представительство ☺️), вы можете поместить его в диапазоне с \u263a:

In [71]: s = 'blah xzuyguhbc ibcbb bqw 2 extract1 ☺️ jbjhcb 6 extract2 bjvcvvv' 

In [72]: regex = re.compile(r'\d+(.*?)(?:\u263a|\U0001f645)') 

In [74]: regex.findall(s) 
Out[74]: [' extract1 ', ' extract2 '] 

Or если вы хотите, чтобы соответствовать более emojies вы можете использовать диапазон символов (здесь хорошая ссылка, которая показывает вам правильный выбор для различных emojies http://apps.timwhitlock.info/emoji/tables/unicode):

In [75]: regex = re.compile(r'\d+(.*?)[\u263a-\U0001f645]') 

In [76]: regex.findall(s) 
Out[76]: [' extract1 ', ' extract2 '] 

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

Вот еще один пример:

In [77]: s = "blah 4 xzuyguhbc ibcbb bqw 2 extract1 ☺️ jbjhcb 6 extract2 bjvcvvv" 

In [78]: regex = re.compile(r'\d+(.*?)[\u263a-\U0001f645]') 

In [79]: regex.findall(s) 
Out[79]: [' xzuyguhbc ', ' extract1 ', ' extract2 '] 
+0

Мне нужно, чтобы он работал со всеми emoji, а не только с данными, приведенными в примере – LeDerp

+0

@LeDerp Как я уже говорил, в этом случае вам нужно использовать диапазон символов. – Kasramvd

0

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

В любом случае, без дополнительной информации, это то, что я сделал бы.

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import re 

my_regex = re.compile(r'\d\s*([^☺️|^]+)') 

string = "blah xzuyguhbc ibcbb bqw 2 extract1 ☺️ jbjhcb 6 extract2 bjvcvvv" 

m = my_regex.findall(string) 
if m: 
    print m 
+0

Мне нужно, чтобы он работал со всеми emoji, а не только с данными, приведенными в примере – LeDerp

+0

. Тогда вам понадобится рабочий список, шаблон для каждого emoji отличается, его можно сказать, что мне нужно сопоставить каждое слово на английском и Для этого мне нужно одно регулярное выражение. В противном случае подумайте о другом шаблоне, возможно, вы знаете, что это всегда одно слово после номера, после чего вы могли бы сказать следующее слово после номера и не заботиться об эможи. – reticentroot

1

Вот мой удар по решению. Не уверен, что он будет работать при любых обстоятельствах. Фокус в том, чтобы преобразовать все unicode emojis в обычный текст. Это можно сделать, следуя this post. Затем вы можете сопоставить эможи как обычный текст. Обратите внимание, что он не будет работать, если строка буква строки \u или \U находится в вашем тексте.

Пример: Скопируйте строку в файл, назовем ее emo. В терминале:

Chip [email protected] 03:24:[email protected] ~: cat emo | python stackoverflow.py 
blah xzuyguhbc ibcbb bqw 2 extract1 \u263a\ufe0f jbjhcb 6 extract2 \U0001f645 bjvcvvv\n 
------------------------ 
[' extract1 ', ' extract2 '] 

Где stackoverflow.py файл:

import fileinput 
a = fileinput.input(); 
for line in a: 
    teststring = unicode(line,'utf-8') 
    teststring = teststring.encode('unicode-escape') 

import re 
print teststring 
print "------------------------" 
m = re.findall('(?<=[\s][\d])(.*?)(?=\\\\[uU])', teststring) 
print m 
Смежные вопросы