如果文本包含超过 255 的数字,如何匹配数字范围?

如果文本包含超过 255 的数字,如何匹配数字范围?

我在带有 Python 脚本插件的 Notepad++ 中使用以下代码来匹配和增加 106 到 255 之间的数字,并以两边的空格分隔:

import re
import random
def calculate(match):
    return '%s' % (str(int(match.group(1)) + 4))

editor.rereplace('((?<= )1[0-1][6-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5](?= ))', calculate)

但是如果我想包含大于 255 的数字怎么办?例如,我想包含最多 637 而不是 255。我该怎么做?如果不使用 RegEx,也许还有其他方法可以做到这一点?

答案1

首先,这些(?<= )(?= )前瞻应该是外部(numbers)内,而不是组内。例如,现在,初始“空格前”(?<= )运算符仅适用于 1[0-1][6-9] – 它不适用于所有其他以 | 分隔的替代项!即使没有空格分隔,您的正则表达式实际上也会匹配“abcdef200”。

(并且由于“1[0-9][0-9]”部分,它还匹配从 100 开始的值,而不是从 106 开始的值。)

因此你应该使用:

editor.rereplace('(?<= )(1[0-1][6-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?= )',
                 calculate)

中间的主要正则表达式很长,但实际上并不复杂——它只是一个|以 - 分隔的选项列表,列举了数字可能出现的所有方式。

例如,如果要匹配数字 106 至 637,则可以按如下方式对它们进行分组(最后一位数字、最后 2 位数字、所有 3 位数字,然后以相同方式返回):

  • 106至109:10[6-9]
  • 110 至 199(实际上是 11_ 至 19_):1[1-9][0-9]
  • 200 至 599(实际上是 2__ 至 5__):[2-5][0-9][0-9]
  • 600 至 629(实际上是 60_ 至 62_):6[0-2][0-9]
  • 630 至 637:63[0-7]

所以最终的正则表达式将是这样的:

(?<= )(10[6-9]|1[1-9][0-9]|[2-5][0-9][0-9]|6[0-2][0-9]|63[0-7])(?= )

然而,你有Python。您不需要将所有逻辑都塞进正则表达式中——您可以先匹配所有数字,然后让 Python 回调决定每个结果的替换:

def calculate(match):
    number = int(match.group(1))
    if 106 <= number <= 637:
        return str(number + 4)
    else:
        return str(number)

editor.rereplace('(?<= )([0-9]{3})(?= )', calculate)

匹配[0-9]{3}所有 3 位数字(作为一点预防措施),并将它们替换为其自身或增加的值。

相关内容