我有一堆数字ID,我需要用新的数字ID编号

id="12.03"

id="23.343.Fdf--"

id="12-B.fdas7232"

id="12."

id="1."

id="1.-2"

id="2.02-R.-vdfs--erev-j"

id="48-34JJf"

id="5.01-G.f"

使用这个正则表达式:

 id="[1-9]\d*(\.\d+)?

https://regexr.com/点,I am able to get the correct matches点.

然而,当我运行python脚本时,我认为这与捕获返回太多值的组有关.

以下是打印输出的两个示例:

('id="5.01","id=",'5.01','0.01')

我不知道如何阻止它返回上述两个示例中的第四个值".01"或"".

我得到这个错误:too many values to unpack (expected 3)

我try 了几种不同的正则表达式变体,试图让它返回单个字符串,比如添加额外的括号,^和$来标记字符串的开头和结尾,等等.

    PID_REPLACEMENTS = {
    "48":'9',
    "23.343":'8',
    "12.03":'7',
    "12":'6',
    "5.01":'5',
    "2.02":'4',
    "1":'3.08'}

    my_text = substitute_oldid_index(my_text)

def substitute_oldid_index(my_text):
    return substitute_newid(r"""((?P<pre> id=")(?P<post>[1-9]\d*(\.\d+)?))""", my_text)


def substitute_newid (findallnewid_regex, my_text):
    data_oldids = re.findall(findallnewid_regex, my_text, re.I)

    print(data_oldids)

    for combined, pre, post in data_oldids:
    if post.title() not in PID_REPLACEMENTS:
        continue

    my_text = re.sub(combined, "{}{}".format(pre, PID_REPLACEMENTS[post.title()]), my_text)

    return my_text

有没有更好的方法来查找数字ID(可能包含小数点和其他句点,或者后面应该保持静态的文本),并用新的数字ID(可能包含也可能不包含小数点)替换它们?我想我们应该按照相反的时间顺序来做,这样就不会多次找到较低的数字了?

有没有办法修复我的正则表达式和脚本来实现这个目标?


作为后续问题,我在Electron 表格中有一系列范围,需要转换为新的ID号.

例1:

例2:

有没有办法搜索这些号码并用新号码替换?

例如,从字典中找到5.01并将其替换为5

推荐答案

我认为你让比赛变得更加困难,无论是赛前还是赛后.为什么不直接寻找数字,可选地后跟一个点和数字,如果这个集合在你的列表中,就替换它?这就是:

import re

PID_REPLACEMENTS = {
"48":'9',
"23.343":'8',
"12.03":'7',
"12":'6',
"5.01":'5',
"2.02":'4',
"1.":'3.08'}

sample = """
id="12.03"         12.03
id="23.343.Fdf--"  23.343
id="12-B.fdas7232"
id="12."           12.
id="1."            1.
id="1.-2"
id="2.02-R.-vdfs--erev-j"
id="48-34JJf"
id="5.01-G.f"      5.01
id="[1-9]\d*(\.\d+)?
EXAMPLE 1: 5.01-48; 151.01-168; 224-382; 415-510; 218-249
EXAMPLE 2: 128-211; 257-281; 386-401
"""

def subst(m):
    m = m.group(0)
    return PID_REPLACEMENTS.get(m,m)

def substitute_newid(my_text):
    return re.sub('(?<=id=")\d+(\.\d*)?', subst, my_text)

print( substitute_newid(sample) )
"""

def subst(m):
    m = m.group(0)
    return PID_REPLACEMENTS.get(m,m)

def substitute_newid(my_text):
    return re.sub('(?<=id=")\d+(\.\d*)?', subst, my_text)

print( substitute_newid(sample) )

输出:


id="7"         12.03
id="8.Fdf--"  23.343
id="6-B.fdas7232"
id="12."           12.
id="3.08"            1.
id="3.08-2"
id="4-R.-vdfs--erev-j"
id="9-34JJf"
id="5-G.f"      5.01
id="[1-9]\d*(\.\d+)?
EXAMPLE 1: 5.01-48; 151.01-168; 224-382; 415-510; 218-249
EXAMPLE 2: 128-211; 257-281; 386-401

Python相关问答推荐

有什么方法可以修复奇怪的y轴Python matplotlib图吗?

解析讨论论坛只给我第一个用户 comments ,但没有给我其他用户回复

了解shuffle在NP.random.Generator.choice()中的作用

如何将我的位置与光强度数据匹配到折射图案曲线中?

使用Beautiful Soup获取第二个srcset属性

如何使用Selenium访问svg对象内部的元素

Python无法在已导入的目录中看到新模块

具有症状的分段函数:如何仅针对某些输入值定义函数?

如何根据日期和时间将状态更新为已过期或活动?

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

加速Python循环

driver. find_element无法通过class_name找到元素'""

如何在UserSerializer中添加显式字段?

使用groupby方法移除公共子字符串

无法连接到Keycloat服务器

如何在FastAPI中为我上传的json文件提供索引ID?

在Python中从嵌套的for循环中获取插值

提高算法效率的策略?

用两个字符串构建回文