Как сделать условное выражение If Then Else Regex - PullRequest
2 голосов
/ 25 февраля 2020

Я пытаюсь сделать условный оператор If-Then-Else в регулярных выражениях.

Регулярное выражение принимает в качестве входных данных строку, представляющую имя файла.

Вот мои тестовые строки .. .

The Edge Of Seventeen 2016 720p.mp4
20180511 2314 - Film4 - Northern Soul.ts
20150526 2059 - BBC Four - We Need to Talk About Kevin.ts

В первой строке 2016 год представляет год, а в двух других строках 2314 и 2059 - время в 24-часовом формате.

Имя файла следует сохранить без изменений, если оно соответствует этому регулярному выражению:

\d{8} \d{4} -.*?- .*?\.ts

Что я проверил, и это работает. Он может соответствовать следующим тестовым строкам:

20180511 2314 - Film4 - Northern Soul.ts
20150526 2059 - BBC Four - We Need to Talk About Kevin.ts

Если имя файла не соответствует первому регулярному выражению, к нему следует применить это регулярное выражение:

(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?

Это регулярное выражение cleandatetime, которое Используется Kodi для удаления всего из строки ПОСЛЕ числа четырех git, если оно существует, представляющего дату между 1900 и 2099 гг. Я также проверил это, и оно работает.

Вот что у меня есть попытался создать регулярное выражение If-Then-Else, но оно не работает:

Я использую этот формат -> (? (A) X | Y)

(?(\d{8} \d{4} -.*?- .*?\.ts)^.*$|(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?)

Это A

\d{8} \d{4} -.*?- .*?\.ts

Это X

^.*$

Это Y

(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?

Это ожидаемый результат ...

Тестовая строка: The Edge Of Seventeen 2016 720p.mp4 Ожидаемый результат:"The Edge Of Seventeen 2016" (цитаты включены только для того, чтобы показать, что в конце можно оставить пробел)

Тестовая строка: 20180511 2314 - Film4 - Northern Soul.ts Ожидаемый результат: 20180511 2314 - Film4 - Northern Soul.ts * 1 047 *

Тестовая строка: 20150526 2059 - BB C Four - нам нужно поговорить о Kevin.ts Ожидаемый результат: 20150526 2059 - BB C Four - We Необходимо поговорить о Kevin.ts

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

Приветствия,

Flex

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Вы можете использовать шаблон PCRE, например

^(?!\d{8} \d{4} -.*?- .*?\.ts$)(.*[^ _,.()\[\]-][ _.()\[\]-]+(?:19|20)[0-9]{2})(?:[ _,.()\[\]-]|[^0-9]$)?.*

Заменить на $1, см. Демонстрацию regex .

Соответствует

  • ^ - начало строки
  • (?!\d{8} \d{4} -.*?- .*?\.ts$) - отрицательный взгляд не может найти совпадение, если вся строка соответствует
    • \d{8} \d{4} - 8 цифр, пробел, 4 цифры, пробел
    • -.*?- .*? - -, затем любые 0 или более символов, кроме символов разрыва строки, как можно меньше, - и пробел, а затем снова 0 или более символов, кроме символов разрыва строки, как можно меньше
    • \.ts$ - .ts в конце строки
  • (.*[^ _,.()\[\]-][ _.()\[\]-]+(?:19|20)[0-9]{2})(?:[ _,.()\[\]-]|[^0-9]$)?.*: необязательная группа 1, а затем остальная часть строки:
    • .* - любые 0+ символов, кроме символов разрыва строки, как можно больше
    • [^ _,.()\[\]-] - символ, отличный от
    • [ _.()\[\]-]+ - 1+ пробелы , _, ., (, ), [, ] или -
    • (?:19|20) - 19 или 20
    • [0-9]{2} - две цифры
    • (?:[ _,.()\[\]-]|[^0-9]$)? - необязательное сопоставление группы без захвата пробел, _, ., (, ), [, ] или - или любой символ, отличный от di git в конце строки.
    • .*[^ _,.()\[\]-][ _.()\[\]-]+(?:19|20)[0-9]{2})(?:[ _,.()\[\]-]|[^0-9]$
    • .* - любые 0+ символов, кроме символов разрыва строки, как можно больше.
0 голосов
/ 25 февраля 2020

Поскольку вы упомянули, что A, X и Y протестированы и признаны работающими, и поскольку существует только 2 шаблона, я думаю, что этот шаблон будет работать (стиль Python):

pattern = "(.?(?=" + A + ")" + X + ")|(" + Y + ")"

, что означает:

(.?(?=A)X)|(Y)

Объяснение:

  1. Есть две группы - одна для X и одна для Y.
  2. Группа для захвата X начинается с .?, просто чтобы запустить двигатель и проверить, есть ли деталь, соответствующая X впереди (взгляд вперед). Если да, он продолжает сопоставление X, так как он встретит его после блока просмотра.
  3. Если в (2) просмотр не совпадает, то часть | (или), которая это Y вступит во владение. Если это соответствует, вы получите результат. Иначе, нет вывода.

(К сожалению, выложенные вами шаблоны для A и Y не работают для меня на Python, поэтому я заменил их на свои собственные для тестирования. Пожалуйста подтвердите, работает ли шаблон с исходными.)

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