考虑字符串中自定义转义字符的正则表达式(不在模式中)

时间:2015-11-20 15:45:01

标签: python regex

我正在构建一个必须匹配以特定符号开头的特定模式的正则表达式,但同时它必须不匹配以两个或多个相同特定符号出现的模式。

为了更好地阐述,这是我的方案。我有一个这样的字符串:

Hello %partials/footer/mail,
%no_slashes_here
%{using_braces}_here
%%should_not_be_matched

我尝试匹配那些以一个%符号开头的子串(因为在我的情况下,双%%表示"转义"并且不应该它们可以选择用花括号包围。最后,我需要捕获匹配的子串,但没有%符号。

到目前为止,我的正则表达式是:

%\{*([0-9a-zA-Z_/]+)\}*

捕获的匹配结果为:

partials/footer/mail
no_slashes_here
using_braces
should_not_be_matched

这与我需要的非常接近,但我陷入了双%%逃脱的部分。我不知道如何在开头时否定两个或多个%符号,同时也允许在开头只出现一次。

修改 很抱歉,我错过了,我使用的是python。

3 个答案:

答案 0 :(得分:2)

负面观察:

%(?<!%%)\{*([0-9a-zA-Z_\/]+)\}*

Regex 101

答案 1 :(得分:1)

如果这是基于行的 - 你可以这样做:

(?:^|[^%])%\{?([^%}]+)\}?

Demo

Python演示:

txt='''\
Hello %partials/footer/mail,
%no_slashes_here
%{using_braces}_here
%%should_not_be_matched
This %% niether'''

import re

for line in txt.splitlines():
    m=re.search(r'(?:^|[^%])%\{?([^%}]+)\}?', line)
    if m:
        print m.group(1)

从您的问题中不清楚% this % should be treated

答案 2 :(得分:-1)

怎么样?
(?<=%)([^%]+)

Regex101 demo

我已经承担了PCRE,因为您还没有声明您正在使用哪种正则表达式。