Сопоставление нескольких регулярных выражений в пределах поиска

#regex #regex-lookarounds

#регулярное выражение #поиск регулярных выражений

Вопрос:

я пытаюсь выполнить множественное сопоставление в lookbehind и заглянуть вперед

Допустим, у меня есть следующая строка:

 $ Hi, this is an example @
  

Регулярное выражение: (?<=$). a. (?=@)

Я ожидаю, что он вернет оба ‘a’ в пределах этих границ, есть ли способ сделать это только с одним регулярным выражением?

Движок: Python

Комментарии:

1. Используйте G привязку.

2. (?:$|(?!^)G)[^a]*K(a)(?=.*?@) regex101.com/r/1BMCeK/1

3. Какой движок? Обычно, если Python вам нужно захватить между $- @, затем обработать a . Может быть только 2-шаговым процессом. В модуле регулярных выражений Pythons (не re) вы можете использовать привязку G. Это ваши единственные варианты.

4.При необходимости есть опция конечного множественного захвата. Допустим, в этой строке может быть не более 10 символов. $[^a]*(a)(?:[^a]*(a)(?:[^a]*(a)(?:[^a]*(a)(?:[^a]*(a)(?:[^a]*(a)(?:[^a]*(a)(?:[^a]*(a)(?:[^a]*(a)(?:[^a]*(a))?)?)?)?)?)?)?)?)?.*@ regex101.com/r/LDTEAP/1 Вы можете сделать это таким образом .. Если вам нужно ограничить только не $ @ символы между ними, измените [^a] на [^a$@]

Ответ №1:

Если вы можете использовать кванторы в поиске, используйте

 (?<=$[^$@]*?)a(?=[^@]*@)
  

Смотрите Доказательство.

Объяснение

 --------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    $                       '$'
--------------------------------------------------------------------------------
    [^$@]*?                  any character except: '$' and '@' (0 or more
                             times (matching the least amount possible))
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  a                        'a'
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    [^@]*                    any character except: '@' (0 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    @                        '@'
--------------------------------------------------------------------------------
  )                        end of look-ahead
  

Шаблон PCRE:

 (?:G(?<!^)|$)[^$]*?Ka(?=[^@]*@)
  

Смотрите другое доказательство

Объяснение

 --------------------------------------------------------------------------------
  (?:                      group, but do not capture:
--------------------------------------------------------------------------------
    G                       where the last m//g left off
--------------------------------------------------------------------------------
    (?<!                     look behind to see if there is not:
--------------------------------------------------------------------------------
      ^                        the beginning of the string
--------------------------------------------------------------------------------
    )                        end of look-behind
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    $                       '$'
--------------------------------------------------------------------------------
  )                        end of grouping
--------------------------------------------------------------------------------
  [^$@]*?                  any character except: '$' and '@' (0 or more times
                           (matching the least amount possible))
--------------------------------------------------------------------------------
  K                       match reset operator
--------------------------------------------------------------------------------
  a                        'a'
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    [^@]*                    any character except: '@' (0 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    @                        '@'
--------------------------------------------------------------------------------
  )                        end of look-ahead
  

Комментарии:

1. Большое спасибо, однако regex101 говорит, что для моего движка lookbehind не может содержать кванторов (Python) какой-либо обходной путь?

2. Какой движок точечный, переменный < утверждения? Зачем ограничивать с [^$] помощью и [^@] ?

3. @CamiloPenagos Нет проблем, установите эту библиотеку и используйте любой из шаблонов.

4. @RyszardCzech Дело в том, что я использую API, который я не могу изменить его серверную часть, это чистый python, я просто отправляю содержимое и выражение.

5. @CamiloPenagos Тогда, мне жаль это говорить, вы застряли.