查找并替换数字(可以有小数点)ID

Find and replace numeric (which can have decimal points) ids

我有一堆数字 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/我能够得到正确的匹配项

但是,当我 运行 python 脚本时,我认为这与捕获组有关 returning 太多值。

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

('id="5.01', 'id="', '5.01', '.01') ('id="48', 'id="', '48', '')

我不知道如何阻止它return输入上面两个例子中的第 4 个值“.01”或“”。

我收到此错误:要解压的值太多(预期为 3)

我尝试了几种不同的 Regex 变体来尝试将其变成 return 单个字符串,例如添加额外的括号、^ 和 $ 来标记字符串的开头和结尾等。

    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(可能包含也可能不包含小数点)?我想我们想按相反的时间顺序来做,这样就不会多次找到较低的数字?

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


作为后续问题,我在电子表格中有一堆范围需要转换为新的 ID 号。

示例 1: 5.01-48; 151.01-168; 224-382; 415-510; 218-249

示例 2: 128-211; 257-281; 386-401

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

例如从字典中找到5.01并用上面的5替换

我认为您使用 pre- 和 post-matches 让这变得比需要的更难。为什么不只查找数字,可以选择后跟一个点和数字,如果该集合在您的列表中,则替换它?这是这样做的:

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