需要消极看待吗?

时间:2016-01-12 10:02:58

标签: python regex

我试图获得以下文字

编辑:第二个$ :: / ::必须是可选的

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方法用于匹配而不是替换。搜索/匹配或查找?

4 个答案:

答案 0 :(得分:2)

您需要将贪婪点匹配模式替换为tempered greedy token

 \$?::(?=(?:(?!\$?::)[^\]])*\])
         ^^^^^^^^^^^^^^^^^^^

只有在$::$::之前没有跟::之后才会与]匹配。

  • (?:(?!\$?::)[^\]])* - ((?:...)*)零个或多个序列......
    • (?!\$?::)[^\]] - 非]字符([^\]]),不是$::::序列的起点

请注意,如果您不确定在第一个$::之前的]之后可以显示什么,则可以使用此正则表达式。否则,r" \$?::(?=\w+ *])"正则表达式应该适合您。

请参阅regex demo

Python code

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*\])会在$::

旁边的字词中找到::]

RegEx Demo

答案 3 :(得分:1)

你可以使用lookbehind,因为你想要的匹配前面有contains,并$可选:

(?<=contains )\$?::([A-Z]+)

查看regex101

上的演示