我有一堆数字I,我需要用新的数字I编号。
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脚本时,我认为它与捕获返回太多值的组有关。
以下是打印输出的两个示例:
(id=“5.01”、“id=”、“5.01”、“.01”)(“id=”48、“id=”、“48”)
我不知道如何阻止它返回上面两个例子中的第四个值'.01‘或'’。
我得到了以下错误:值太多,无法解压(预期的3)
我尝试了几个不同的Regex变体,试图让它返回单个字符串,比如添加额外的括号、^和$来标记字符串的开始和结束,等等。
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(可能包含小数点,也可能不包含小数点)替换它们?我想我们想要用相反的时间顺序来做,这样就不会发现更低的数字了?
有什么方法可以修复我的regex和脚本来实现这个目标吗?
作为后续问题,我在电子表格中有一堆需要转换为新ID号的范围。
例1: 5.01-48;151.01-168;224-382;415-510;218-249
例2: 128-211;257-281;386-401
有没有办法搜索这些数字并用一个新的号码替换它们?
例如,查找5.01并将其替换为上面字典中的5
发布于 2022-04-10 23:25:30
我觉得你在赛前和赛后都让这件事变得更难了。为什么不直接查找数字,可选地后面跟着一个点和数字,如果该集合在您的列表中,替换它?这样做是为了:
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-401https://stackoverflow.com/questions/71814203
复制相似问题