如何用Python正则表达式匹配两单词间的非空白内容?
解决正则匹配空白内容的问题
嘿,这个问题很常见,我来帮你调整正则表达式解决它!
首先,你当前代码里的正则 r'Madrid:(.*?)Newyork' 之所以会匹配空白内容,是因为 .*? 会匹配任意字符(包括所有空白字符,甚至完全空的内容)——哪怕 Madrid: 和 Newyork 之间只有空格、制表符,或者啥都没有,它都会触发匹配返回 True,这显然不符合你的需求。
解决方案:添加负向前瞻断言限制
我们可以给正则加一个负向前瞻断言,确保 Madrid: 后面不会直接跟着空白+Newyork,也就是强制两者之间必须有非空白的有效内容。修改后的正则如下:
pattern = r'Madrid:(?!\s*Newyork)(.*?)Newyork'
关键部分解释:
(?!\s*Newyork):这是负向前瞻断言,它不会消耗任何字符,只是做一个检查——如果Madrid:后面紧跟着任意数量的空白字符(\s*)然后直接是Newyork,整个正则就不匹配;反之,只要中间有至少一个非空白字符,就会正常匹配。
完整代码示例
import re def has_valid_content(input_string): # 修改后的正则模式 pattern = r'Madrid:(?!\s*Newyork)(.*?)Newyork' search_result = re.search(pattern, input_string, re.I) # 直接返回布尔值,简化代码逻辑 return bool(search_result) # 测试不同场景 test_cases = [ ("Madrid: good bars Newyork: good building Warranty: No", True), ("Madrid: Newyork: something else", False), ("Madrid:Newyork", False), ("Madrid: coffee shops Newyork", True) ] for test_str, expected in test_cases: result = has_valid_content(test_str) print(f"测试字符串: '{test_str}' → 结果: {result} (预期: {expected})")
另一种等价写法
如果你觉得前瞻断言有点绕,也可以用更直观的方式:强制 Madrid: 后面必须先出现至少一个非空白字符,再匹配后续内容:
pattern = r'Madrid:\s*\S.*?Newyork'
这里 \s*\S 的意思是:可以有任意数量的空白,但之后必须跟着一个非空白字符(\S),这样就确保了中间存在有效内容。
两种写法都能满足你的需求,选你觉得更易读的就行~
内容的提问来源于stack exchange,提问作者Joan Triay
相关产品推荐
相关产品推荐

