#regex #regex-lookarounds
#регулярное выражение #поиск регулярных выражений
Вопрос:
я пытаюсь выполнить множественное сопоставление в lookbehind и заглянуть вперед
Допустим, у меня есть следующая строка:
$ Hi, this is an example @
Регулярное выражение: (?<=$). a. (?=@)
Я ожидаю, что он вернет оба ‘a’ в пределах этих границ, есть ли способ сделать это только с одним регулярным выражением?
Движок: Python
Комментарии:
1. Используйте
G
привязку.2.
(?:$|(?!^)G)[^a]*K(a)(?=.*?@)
regex101.com/r/1BMCeK/13. Какой движок? Обычно, если 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 Тогда, мне жаль это говорить, вы застряли.