查找并替换数字(可以有小数点)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
我有一堆数字 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