我试图获得以下文字
编辑:第二个$ :: / ::必须是可选的
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
}
即从$::
旁边的字词中删除::
或\]
到目前为止,我有正则表达式,
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方法用于匹配而不是替换。搜索/匹配或查找?
答案 0 :(得分:2)
您需要将贪婪点匹配模式替换为tempered greedy token:
\$?::(?=(?:(?!\$?::)[^\]])*\])
^^^^^^^^^^^^^^^^^^^
只有在$::
或$::
之前没有跟::
之后才会与]
匹配。
(?:(?!\$?::)[^\]])*
- ((?:...)*
)零个或多个序列......
(?!\$?::)[^\]]
- 非]
字符([^\]]
),不是$::
或::
序列的起点 请注意,如果您不确定在第一个$::
之前的]
之后可以显示什么,则可以使用此正则表达式。否则,r" \$?::(?=\w+ *])"
正则表达式应该适合您。
请参阅regex demo
import re
p = re.compile(r' \$?::(?=(?:(?!\$?::)[^\]])*\])')
test_str = "when HTTP_REQUEST {\n if { [matchclass $::USERAGENT contains $::XYZ ] or [matchclass $::USERAGENT contains $::ABC ] } { drop }\n if { [matchclass $USERAGENT contains ::TEST ] } { drop }\n if { [ matchclass $::useragent contains $::TEST ] } { drop }\n return \n}\n\n"
result = p.sub(" ", test_str)
print(result)
答案 1 :(得分:2)
由于contains
这个词(至少在你的例子中)总是在之前,
你也可以使用:
re.sub('(?<=contains) *\$?::', ' ', x)
答案 2 :(得分:1)
您可以使用此正则表达式进行替换:
$test = re.sub((r'\$?::(?=\w+\s*\])', '', $text);
Lookahead (?=\w+\s*\])
会在$::
::
或]
答案 3 :(得分:1)