You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:38:32