Python 是否需要消极的回头看?
我正在尝试获取以下文本 编辑:第二个$:/::必须是可选的Python 是否需要消极的回头看?,python,regex,Python,Regex,我正在尝试获取以下文本 编辑:第二个$:/::必须是可选的 when HTTP_REQUEST { if { [matchclass ::USERAGENT contains $::XYZ ] or [matchclass $::USERAGENT contains $::ABC ] } { drop } if { [matchclass $USERAGENT contains ::TEST ] } { drop } if { [ matchclass $::user
when HTTP_REQUEST {
if { [matchclass ::USERAGENT contains $::XYZ ] or [matchclass $::USERAGENT contains $::ABC ] } { drop }
if { [matchclass $USERAGENT contains ::TEST ] } { drop }
if { [ matchclass $::useragent contains TEST ] } { drop }
return
}
像这样
when HTTP_REQUEST {
if { [matchclass ::USERAGENT contains XYZ ] or [matchclass $::USERAGENT contains ABC ] } { drop }
if { [matchclass $USERAGENT contains TEST ] } { drop }
if { [ matchclass $::useragent contains TEST ] } { drop }
return
}
i、 e从\]
旁边的单词中删除$:
或:
到目前为止我有正则表达式
re.sub(' \$?::(?=.*\])', ' ', text)
但这会产生,
when HTTP_REQUEST {
if { [matchclass USERAGENT contains XYZ ] or [matchclass USERAGENT contains ABC ] } { drop }
if { [matchclass $USERAGENT contains TEST ] } { drop }
if { [ matchclass useragent contains TEST ] } { drop }
return
}
有什么想法吗?此外,匹配而不是替换的re方法是什么。搜索/匹配或findall?您需要将贪婪点匹配模式替换为: 它将与
$:
匹配,前提是后面不跟$:
或:
直到第一个]
-零个或多个((?:(?!\$?:)[^\]]*
)序列。。。(?:…)*
-非(?!\$?:)[^\]
字符(]
),它不是[^\]
或$:
序列的起点:
$:
之后第一个]
之前会出现什么,则可以使用此正则表达式,否则,r“\$?:(?=\w+*])”
正则表达式应该适合您
看
:
您可以使用此正则表达式进行替换:
$test = re.sub((r'\$?::(?=\w+\s*\])', '', $text);
向前看(?=\w+\s*\])
将从]
旁边的单词中找到$:
或:
因为
包含的单词(至少在您的示例中)总是在前面出现,
您还可以使用:
re.sub('(?<=contains) *\$?::', ' ', x)
re.sub(”(?您可以使用lookback,因为所需的匹配前面有contains
,并使$
可选:
(?<=contains )\$?::([A-Z]+)
(?您的答案看起来不错,但在测试时,当第二个$:/::丢失时,它无法工作。即,它删除了第一个。问题已更新。第二个是指哪一个?第二个$::或::。此外,包含的字符可以是任何字符集,也可以是您定义为[A-Z]的单词可以是任何一组characters@felix001:然后请提供额外的输入/输出字符串。您的正则表达式匹配方括号内的所有$:
/:
,因为贪婪的*
。您需要限制它只匹配最后的$:
。顺便说一句,我不会在这里使用lookbehind,因为lookbehind成本太高比lookaheads更简单。此外,lookback在需要匹配的字符串之前检查已知上下文。在您的情况下,该上下文是未知的(根据您的其他注释判断)。您的答案看起来不错,但在测试时,当第二个$::/::丢失时,它无法工作。即,它删除了第一个。问题已更新这是我的假设,最后一个(即使它是唯一的一个)必须更改。是否“\$?::(?=\w+*])”为您工作?请看最后一个单词可以包含任何字符。我还需要在每个块的基础上将其与包含的字符串matchclass进行匹配
re.sub('(?<=contains) *\$?::', ' ', x)
(?<=contains )\$?::([A-Z]+)