Python 如果以下模式允许重复,则重新否定回顾断言
Python re negative lookbehind assertion if following pattern allows repetitions
如果以下模式允许重复,我无法使用 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???
这是限制吗?
" -> 'def'. Why???"
嗯,这很合乎逻辑。看看你的模式:(?<!abc)\s*def
(?<!abc)
- 对前面没有 abc
的位置进行负向后视,仍然会在字符串 中生成除一个位置以外的所有位置
\s*
- 零个或多个空格
def
- 完全匹配 def
因此,返回 def
作为匹配项。为了更清楚地理解这一点,这里有一个小的表示,在负向回顾之后仍然有效的位置:
如您所见,还有7个有效位置。包括 \s*
不会影响任何事情,因为 *
意味着 零 或更多。
因此,首先应用所解释的内容 here,然后应用类似以下的模式:(?<!\bfunction\b\s)\w+\s*=\s*myFunction
来检索您的匹配项。不过可能还有更简洁的方法。
如果以下模式允许重复,我无法使用 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???
这是限制吗?
" -> 'def'. Why???"
嗯,这很合乎逻辑。看看你的模式:(?<!abc)\s*def
(?<!abc)
- 对前面没有abc
的位置进行负向后视,仍然会在字符串 中生成除一个位置以外的所有位置
\s*
- 零个或多个空格def
- 完全匹配 def
因此,返回 def
作为匹配项。为了更清楚地理解这一点,这里有一个小的表示,在负向回顾之后仍然有效的位置:
如您所见,还有7个有效位置。包括 \s*
不会影响任何事情,因为 *
意味着 零 或更多。
因此,首先应用所解释的内容 here,然后应用类似以下的模式:(?<!\bfunction\b\s)\w+\s*=\s*myFunction
来检索您的匹配项。不过可能还有更简洁的方法。