Регулярное выражение, которое возвращает все слова, кроме текста между звездочками - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь найти регулярное выражение, которое разделит текст как \w+, но пропускает любой контент между двумя звездочками.

Я могу идентифицировать выделенный контент следующим образом: (?<=\*)(.*)(?=\*).

Я пытался использовать отрицательный прогноз «вперед / назад», например: (?<!\*)([\w]+)(?!\*), но это соответствуеткаждое слово, в том числе между звездочками, за исключением первого символа до и после звездочек (например, предложение «Река * течет медленно * но верно» будет соответствовать The, river, uns, slowl, but, surely, в то время как желаемыми совпадениями являются только The, river, but и surely).

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

Любая помощь будет очень признательна.Я читал об этом все утро и не менее смущен в этот момент.Я прошел через тег [regex], погуглил, прочитал о регулярных выражениях, но не смог собрать выражения, которые соответствуют тому, что мне нужно.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете сопоставить то, что вам не нужно, и сопоставить и захватить то, что вам нужно:

\*[^*]*\*|(\w+)

См. regex demo .Используйте его с re.findall, который возвращает только захваченные подстроки, если в шаблоне регулярного выражения определена группа захвата.

Подробности

  • \*[^*]*\* - *, затем любые 0+ символов, кроме *, а затем *
  • | - или
  • (\w+) - Группа захвата 1: один или несколько символов слова (буквы, цифры, подчеркивание).Чтобы сопоставлять только буквы, используйте ([^\W\d_]+).

См. Демонстрационную версию Python :

import re
s = "The river *runs slowly* but surely"
res = re.findall(r'\*[^*]*\*|(\w+)', s)
print(list(filter(None, res)))
# => ['The', 'river', 'but', 'surely']
0 голосов
/ 06 февраля 2019

Регулярное выражение, скорее всего, не подходит для этой работы.Это очень похоже на проблему сопоставления скобок / скобок / фигурных скобок (назовите это как хотите).Причина этого в том, что, учитывая текст:

Here is some text *and some between asterisks* and some more and then * some between asterisks * and then normal text.

Регулярное выражение

(?<=\*)[^*]+(?=\*)

вернет вам текст, который находится между звездочками.Однако он вернет:

and some between asterisks
and some more and then
 some between asterisks

Я подозреваю, что вы на самом деле не хотели возвращать and some more then, но механизм регулярных выражений не может определить, что второй * является "закрывающий «звездочка».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...