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]+)