Python 具有可变字符数的否定回顾
Python Negative Lookbehind with a variable number of characters
我知道有很多正则表达式和负面的回顾问题,但我有一个找不到答案。我想找到 water 的实例,但如果它前面有 never 且两者之间的字符数不定,则不会。这两个词之间有无限多个可变字符,lookbehind 不允许可变字符。我有永远不会找到的代码,但它永远不会在脚本的开头找到。 有没有办法将回溯限制为 20 或 30 个字符? 我有什么:
(?i)^(?=.*?(?:water))(?:(?!never).)*$
只是我正在使用的一些示例:
water (match)
I have water (match)
I never have water
Where is the water. (match)
I never have food or water
I never have food but I always have water (match)
I never have food or chips. I like to walk. I have water (match)
同样,问题是我可以有一个 10 句长的段落,如果它有 never 任何地方都找不到 water 并且lookbehind 和lookahead 不接受变量字符。感谢您提供的任何帮助。
Python 不支持具有可变字符数的否定回顾。你可以做的是检查“never is before water”,在这种情况下 return False。例如:
def test(string):
if re.match('.*never.*water.*', string):
return False
elif re.match('.*water.*', string):
return True
else:
# return False?
return False
您可以在 Python 的内置 re
模块中使用此正则表达式:
(?i)^(?!.*\bnever\b.{,20}\bwater\b).*\bwater\b
正则表达式详细信息:
(?i)
: 启用忽略大小写模式
^
: 开始
(?!.*\bnever\b.{,20}\bwater\b)
:负先行条件。如果单词 never
出现在单词 water
. 之前的 20 个字符以内,这将导致匹配失败
.*\bwater\b
:在行 中的任意位置查找单词water
我知道有很多正则表达式和负面的回顾问题,但我有一个找不到答案。我想找到 water 的实例,但如果它前面有 never 且两者之间的字符数不定,则不会。这两个词之间有无限多个可变字符,lookbehind 不允许可变字符。我有永远不会找到的代码,但它永远不会在脚本的开头找到。 有没有办法将回溯限制为 20 或 30 个字符? 我有什么:
(?i)^(?=.*?(?:water))(?:(?!never).)*$
只是我正在使用的一些示例:
water (match)
I have water (match)
I never have water
Where is the water. (match)
I never have food or water
I never have food but I always have water (match)
I never have food or chips. I like to walk. I have water (match)
同样,问题是我可以有一个 10 句长的段落,如果它有 never 任何地方都找不到 water 并且lookbehind 和lookahead 不接受变量字符。感谢您提供的任何帮助。
Python 不支持具有可变字符数的否定回顾。你可以做的是检查“never is before water”,在这种情况下 return False。例如:
def test(string):
if re.match('.*never.*water.*', string):
return False
elif re.match('.*water.*', string):
return True
else:
# return False?
return False
您可以在 Python 的内置 re
模块中使用此正则表达式:
(?i)^(?!.*\bnever\b.{,20}\bwater\b).*\bwater\b
正则表达式详细信息:
(?i)
: 启用忽略大小写模式^
: 开始(?!.*\bnever\b.{,20}\bwater\b)
:负先行条件。如果单词never
出现在单词water
. 之前的 20 个字符以内,这将导致匹配失败
.*\bwater\b
:在行 中的任意位置查找单词
water