Как выделить весь объект вокруг регулярного выражения без предварительного разделения строки?

Мой проект (не связанный с этим вопросом, просто контекст) является классификатором ML, я пытаюсь его улучшить и обнаружил, что когда я вырезал URL-адреса из предоставленного ему текста, некоторые URL-адреса были разбиты пробелами. Например:

https:// twitter.com/username/sta tus/ID

После того, как я удаляю ссылки, которые не разорваны, у меня остаются мысли вроде www website com. Я удалил те, которые имеют следующее регулярное выражение в Python:

tweet = re.sub('(www|http).*?(org |net |edu |com |be |tt |me |ms )','',tweet);

Я поставил пробел после каждого из них, потому что это происходит после обычной полоски и обработки текста (поэтому работать только с частями URL-адреса, разделенными пробелами), и теоретически мы должны собирать только остатки неработающей ссылки ... не что-то вроде

http website strangeTLD .... communication

Это не идеально, но это работает, однако я просто подумал, что могу попытаться упреждающе удалить URL-адреса только из твиттера, поскольку я знаю, что пробелы, которые нарушают обычную полосу URL, всегда будут в одних и тех же местах, надеясь, что это повысит точность моего классификатора? Это избавит вас от строки символов, которая появляется после ссылки ... в частности, изображений, а это большая часть моих данных.

В частности, есть ли способ выбрать объект, окружающий / после:

pic.twitter.com/

или, в соответствии с примером, который я привел ранее, выберите объект после имени пользователя, разбитого пробелом в статусе (я просто догадываюсь об этом регулярном выражении) ...

http.*?twitter.com/*?/sta tus/

Заранее спасибо! И для записи, мне дали этот набор данных для работы; Я не уверен, почему почти все URL-адреса разбиты на пробелы.

потерялись в вашем описании ... можете резюмировать итоги? дайте несколько примеров входной строки и ожидаемого вывода

Rizwan M.Tuman 22.04.2018 09:49

Не очень ясно ... Присутствуют ли пробелы в исходном наборе данных или они появились после ваших первых шагов обработки?

sciroccorics 22.04.2018 10:25

@ RizwanM.Tuman они присутствовали в исходном наборе данных, который мне дали; Сначала я не заметил и не пытаюсь вернуться и приспособиться к ним. Вот пример URL-адреса в твите, который не удаляется из-за пробела: https: // twitter.com/pappiness/stat us / 919752795280027648

Claire 22.04.2018 12:50

Вы проверили мое решение? Разве это не было ясно или чем-то не так?

Francesco B. 22.04.2018 14:47

@FrancescoB. Еще не пробовал! Я скоро встречусь, чтобы попытаться получить исходный набор данных ... посмотреть, смогут ли они посмотреть, как они его получили, и полностью устранить проблему с пространством. Если нет, я приму решение и дам вам знать, как оно пойдет!

Claire 23.04.2018 09:52

большой; в любом случае приведенное ниже решение также работает с пробелами, вставьте их в регулярное выражение и в currentText по мере необходимости

Francesco B. 24.04.2018 08:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
63
1

Ответы 1

Да, то, о чем вы говорите, называется Позитивный взгляд назад и работает с (?<=...), где многоточие следует заменить на то, что вы хотите пропустить.

Например. если вы хотите выбрать все, что идет после username в https://twitter.com/username/status/ID, просто используйте

(?<=https://twitter\.com/username/).*

и вы получите status/ID, как вы можете видеть с этим живая демонстрация.

В этом случае мне пришлось избегать косой черты /, используя обратную косую черту, как того требуют спецификации Regex; Я также использовал Клини звездный оператор, то есть звездочку, чтобы сопоставить любое вхождение . (любой символ), как и вы.

Комбинация положительного просмотра назад указывает некоторый обязательный текст перед текущей позицией курсора; другими словами, он помещает курсор после выражения, которое вы ему скармливаете (если указанный текст существует).

Конечно, в вашем случае этого недостаточно, поскольку username будет не фиксированной строкой, а переменной. Это может быть дополнительным требованием, поскольку ретроспективный просмотр не работает с переменной длиной. Так что можно просто пропустить www.twitter.com/

(?<=https://twitter\.com/).*

А затем через Python создайте подстроку

currentText = "username/status/ID"
result = currentText.split("/",1)[1] # returns status/ID

Протестируйте его в этом демонстрация (нажмите «Выполнить»); простое объяснение того, как это работает, содержится в ответе на этот вопрос (короче говоря, вы просто разделяете строку по первому символу косой черты).

В качестве примечания, пробелы / пробелы не допускаются в URL-адресах и при необходимости обычно кодируются как %20 или + (см., Например, ответ это). Другими словами, каждый полученный вами URL-адрес можно безопасно удалить без пробелов перед обработкой, так ... почему они этого не сделали?

Другие вопросы по теме