Захватите регулярное выражение отрицательного вида с помощью Pandas - PullRequest
0 голосов
/ 24 февраля 2020

Учитывая эти строки:

START-h1-/h1-p-code-/code-code-/code-code-/code-/p-h1-/h1-ol-li-code-/code-p-code-/code-/p-/li-li-code-/code-/li-p-code-/code-/p-li-code-/code-/li-p-code-/code-/p-li-code-/code-code-/code-p-code-br-postmaster@domainname.com-br-br-br-br-br-br-br-br-br-br-br-br-br-br-br-/postmaster@domainname.com-/code-/p-/li-br-li-/li-li-p-code-/code-/p-/li-/ol-p-b-/b-/p-ul-li-/li-li-code-/code-/li-li-code-/code-/li-li-a-/a-/li-/ul-p-a-/a-/p

START-p-code-/code-/p-p-/p-h2-/h2-p-/p-p-code-/code-/p-p-code-/code-code-/code-code-/code-code-/code-code-/code-code-/code-code-/code-/p-p-code-/code-/p-ul-li-strong-/strong-code-/code-/li-li-strong-/strong-code-/code-/li-li-strong-/strong-code-/code-code-/code-/li-li-strong-/strong-code-/code-/li-li-strong-/strong-code-/code-/li-li-strong-/strong-code-/code-/li-li-strong-/strong-code-/code-/li-li-strong-/strong-code-/code-code-/code-/li-li-strong-/strong-code-/code-/li-li-strong-/strong-code-/code-/li-/ul-p-code-/code-/p-h3-/h3-p-code-/code-/p-p-code-/code-code-/code-br-br-code-br-br-/code-code-br-br-br-br-br-br-br-br-/code-/p-h3-/h3-p-/p-p-code-/code-/p-ol-/ol

START-h1-/h1-p-a-/a-/p-p-a-/a-/p-p-strong-/strong-br-/p-p-strong-/strong-br-/p-h1-/h1-ul-li-code-/code-/li-li-ul-br-li-/li-li-code-/code-/li-/ul-/li-/ul-h1-strong-/strong-/h1-ol-li-strong-/strong-/li-li-strong-/strong-strong-/strong-/li-li-strong-/strong-strong-/strong-strong-/strong-/li-/ol-h1-strong-/strong-/h1-ol-li-strong-/strong-ul-br-li-code-/code-/li-li-code-/code-/li-/ul-/li-br-li-strong-/strong-/li-li-code-/code-/li-/ol-h1-a-/a-/h1-p-br-/p

START-h1-/h1-p-/p-p-/p-ul-li-a-/a-/li-li-a-/a-/li-/ul-p-strong-/strong-br-/p-h1-/h1-ol-li-strong-/strong-strong-/strong-br-br-img-/li-br-li-strong-/strong-strong-/strong-br-br-img-/li-br-li-strong-/strong-br-br-img-/li-br-li-strong-/strong-strong-/strong-br-br-img-/li-br-li-strong-/strong-strong-/strong-strong-/strong-strong-/strong-strong-/strong-strong-/strong-br-br-img-/li-br-li-strong-/strong-strong-/strong-br-br-img-/li-br-br-li-strong-/strong-strong-/strong-br-br-img-/li-br-li-strong-/strong-strong-/strong-br-br-img-/li-/ol-p-strong-/strong-strong-/strong-/p-h1-a-/a-a-/a-/h1-p-br-/p-p-/p

И этот шаблон регулярных выражений:

((?<!\/li|-[ou]l)-li|(?<!\/li|\/[ou]l)-\/[ou]l)

Как мне захватить часть слева от -li и вернуться к следующей - персонаж?

Как вы можете видеть здесь в демонстрации https://regex101.com/r/nrNVt9/1, шаблон в настоящее время захватывает только -li, но мне нужно захватить / извлечь, например: -/p-li, -ol-/ol, -br-li, et c. Что бы ни было слева от -li, двигаясь влево к следующему «-» и включая его, затем останавливаясь.

Примечание: я работаю с python / pandas и str.extract, поэтому шаблон должен будь уравновешен, иначе я получаю ошибку:

error: look-behind requires fixed-width pattern

Мне кажется, что меня сбивает с толку отрицательный взгляд.

1 Ответ

2 голосов
/ 24 февраля 2020

Вместо использования вида сзади можно использовать отрицательный прогноз (?! и 2 группы захвата с чередованием для обеих альтернатив.

(?!-[ou]l|-/li)(-[^-\r\n]+)-li|(?!-/[ou]l|-/li)(-[^-\r\n]+)-/[ou]l

Пояснение

  • (?!-[ou]l|-/li) Утверждение о том, что справа не -ol, -ul или -/li
  • (-[^-\r\n]+)-li Захват в группе 1, соответствующий любому символу, кроме - и соответствию -li
  • | или
  • (?!-/[ou]l|-/li) Утверждение, что справа не -/ol, -/ul или -/li
  • (-[^-\r\n]+)-/[ou]l Захват в группе 1 соответствует любому символу кроме - и соответствует либо -/ol или -/ul

Regex demo

...