【问题标题】:Regex negative lookaround with optional whitespace带有可选空格的正则表达式负环视
【发布时间】:2019-08-13 09:06:47
【问题描述】:

我正在尝试查找数字,而不是某些单词。我在 Python3 中使用正则表达式来做到这一点。我的猜测是必须使用负面的环视,但由于可选的空格,我正在苦苦挣扎。请参阅以下示例:

'200 word1 some 50 foo and 5foo 30word2'

请注意,实际上 word1 和 word2 可以被许多不同的词替换,这使得在这些词上搜索正匹配变得更加困难。因此,排除foo 成功的数字会更容易。预期结果是:

[200, 30]

我的尝试:

s = '200 foo some 50 bar and 5bar 30foo
pattern = r"[0-9]+\s?(?!foo)"
re.findall(pattern, s)

结果

['200', '50 ', '5', '3']

【问题讨论】:

    标签: regex python-3.x regex-lookarounds


    【解决方案1】:

    你可以使用

    import re
    s = '200 word1 some 50 foo and 5foo 30word2'
    pattern = r"\b[0-9]+(?!\s*foo|[0-9])"
    print(re.findall(pattern, s))
    # => ['200', '30']
    

    查看Python demoregex graph

    详情

    • \b - 单词边界
    • [0-9]+ - 仅 1+ ASCII 数字
    • (?!\s*foo|[0-9]) - 不立即跟在后面
      • \s*foo - 0+ 个空格和 foo 字符串
      • | - 或
      • [0-9] - 一个 ASCII 数字。

    【讨论】:

      【解决方案2】:

      您应该使用模式\b[0-9]+(?!\s*foo\b)(?=\D),它表示要查找所有后面没有可选空格和单词foo 的数字。

      s = '200 word1 some 50 foo and 5foo 30word2'
      matches = re.findall(r'\b[0-9]+(?!\s*foo\b)(?=\D)', s)
      print(matches)
      

      打印出来:

      ['200', '30']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-26
        • 1970-01-01
        • 2011-09-09
        • 2018-01-09
        相关资源
        最近更新 更多