使用python脚本在记事本中进行算术运算

时间:2019-05-10 17:22:45

标签: python notepad++

有这种类型的数据库。

Database.ini:

[1 StatsObject]
InfoStat=1

[2 StatsObject]
InfoStat=2

etc.

InfoStat值需要乘以特定修饰符。

我将python脚本用于记事本++

import re

FixedStat = 0
StatMod = 20
Result = 0
FixedStatStr = ""

content = editor.getText()
for row, line in enumerate(content.split('\n')):
    for m in re.finditer(r'InfoStat=[0-9]+', line):
        if(int(m.group(0).split('=').pop()) > 0):
            FixedStat = int(m.group(0).split('=').pop())
            Result = FixedStat * StatMod
            FixedStatStr = 'InfoStat=' + str(Result)
            content = re.sub(m.group(0), FixedStatStr, content)
            editor.setText(content)

预期结果:

[1 StatsObject]
InfoStat=20

[2 StatsObject]
InfoStat=40

实际结果:

[1 StatsObject]
InfoStat=400

[2 StatsObject]
InfoStat=40

我想在将1转换为20之后, 在将2转换为40的过程中, 20也在变化 因为:

m.group(0) == 'InfoStat = 2'

我使用

re.sub

所有文字

请告诉我如何在特定行中更改InfoStat的值,而又不影响其他人。

4 个答案:

答案 0 :(得分:0)

您可以使用split开头的'\ n \ n`并替换每个部分,例如

import re

FixedStat = 0
StatMod = 20
Result = 0
FixedStatStr = ""


_content_for_demo = """[1 StatsObject]
InfoStat=1

[2 StatsObject]
InfoStat=2
"""

content = editor.getText()
pattern = r'InfoStat=(\d+)'
for section in content.split('\n\n'):
    match = re.search(pattern, section)
    if match:
        value = int(match.group(1)) * StatMod
        val = 'InfoStat={}'.format(value)
        x = re.sub(match.group(), val, section)
        # print(x) debug
        editor.setText(content)

答案 1 :(得分:0)

无需评论您为通过特定程序进行驱动而付出的努力,可以通过使用标准库configparser模块大大清理数据的读取。这是一个简化的版本:

Let
   ...
   NewName = "Size_"&Date.ToText(DateTime.Date(DateTime.LocalNow())),
   #"Changed Type" = Table.TransformColumnTypes(Sheet1_Table,{{"Size", Int64.Type}}),
   #"Renamed Columns" = Table.RenameColumns(#"Changed Type",{{"Size", NewName}})

in
   #"Renamed Columns"

答案 2 :(得分:0)

如果您要使用正则表达式替换而不是另一个答案中建议的ConfigParser模块,则最好通过将回调传递给re.sub而不是固定对象来一次性完成全部操作替换字符串:

import re

STAT_MOD = 20
STAT_EXP = re.compile("(?P<prefix>InfoStat=)(?P<stat>[0-9]+)")

def fixStat(m):
    fixed = int(m.group("stat")) * STAT_MOD
    return "{}{}".format(m.group("prefix"), fixed)

def fixContent(c):
    return STAT_EXP.sub(fixStat, c)

content = editor.getText()
editor.setText(fixContent(content))

答案 3 :(得分:0)

感谢所有答复。

我通过以下方式解决了我的问题:

import configparser

StatMod = 20

config = configparser.ConfigParser()
config.read('Database.ini')

for section in config.sections():
    for k, v in config[section].items():
        if 'infostat' in k:
            OldValue = int(config.get(section, "infostat"))
            if (OldValue == 0): continue
            # print("OldValue =", OldValue)
            NewValue = int(OldValue * StatMod)
            # print("NewValue =", NewValue)
            config.set(section, "infostat", str(NewValue))
            # print(config.get(section, "infostat"))

with open('Database.ini', "w") as config_file:
    config.write(config_file)