1

如果以下模式允许重复,我无法使用 python re 模块使否定后向断言工作:

import re

ok = re.compile( r'(?<!abc)def' )
print( ok.search( 'abcdef' ) ) 
# -> None (ok)
print( ok.search( 'abc def' ) )
# -> 'def' (ok)

nok = re.compile( r'(?<!abc)\s*def' )
print( nok.search( 'abcdef' ) ) 
# -> None (ok)
print( nok.search( 'abc def' ) )
# -> 'def'. Why???

我的真实案例应用程序是,只有当匹配项前面没有'function'时,我才想在文件中找到匹配项:

# Must match
mustMatch = 'x = myFunction( y )'

# Must not match
mustNotMatch = 'function x = myFunction( y )'

# Tried without success (always matches)
tried = re.compile( r'(?<!\bfunction\b)\s*\w+\s*=\s*myFunction' )
print( tried.search( mustMatch  ) ) 
# -> match
print( tried.search( mustNotMatch  ) )
# -> match as well. Why???

这是一个限制吗?

4

1 回答 1

1

” -> 'def'。为什么???”

嗯,这很合乎逻辑。看看你的模式:(?<!abc)\s*def

  • (?<!abc)- 对前面没有的位置进行负向后查找abc,仍然会在字符串中生成除一个位置之外的所有位置
  • \s*- 零个或多个空格
  • def- 有点匹配def

因此,def作为匹配返回。为了更清楚地理解这一点,这里有一个小的表示,在消极的后视之后仍然有效的位置:

在此处输入图像描述

如您所见,仍有 7 个有效职位。并且包括\s*不会影响任何事情,因为*意味着或更多。

因此,首先应用此处解释的内容,然后应用类似的模式:(?<!\bfunction\b\s)\w+\s*=\s*myFunction检索您的匹配项。不过可能有更简洁的方法。

于 2020-04-07T16:30:57.190 回答