带整数字符串混合和组匹配问题的Python打印 重新导入 导入字符串 line=“F1、F2、F3、F6、R1、R3、R341、C1、C10、C2、FL1、FL5” 行(无数字=re.findall(“\D”,行)#生成一行,参考F、F、F、R、R、R、R、C、C、FL、FL 行无数字行字符串=“”。连接(映射(str,行无数字)) ############################################################# res=行\u无\u数字\u字符串。拆分(“,”) alpha_char_unique=[] 对于res中的i:#获取唯一的引用前缀 如果我不在alpha_char_unique中: alpha_char_unique.append(i) ############################################################# line2=行分割(“,”) preLine=“” result=“” 对于alpha_char_unique中的j: p=重新编译(j) 前置行=[s代表第2行中的s,如果p匹配] 如果重新搜索('\d+',l)不是None,则仅数字=[int(重新搜索('\d+',l).group(0)]用于前行中的l]#提取匹配项或前缀的数字,工作不正常 仅限数字。sort()#对数字进行排序以在下面的代码中工作 #打印(仅限数字) c=0#计数器 结果=“输出结果” 电流=无 运行=错误 x=len(仅限数字) 当c开始数量: 结果.追加(“%s%d-%s%d%”(最后\u个字母,起始\u个,最后\u个字母,最新\u个)) 其他: result.append(“%s%d%”(最后\u个字母,起始\u个)) 字母\u map=OrderedDict() 对于字母,数字以“([A-Z]+)(\\d+”)行显示: 数字=整数(数字) 如果不是字母图中的字母: 字母映射[字母]=[] 字母映射[字母]。追加(数字) 最后字母=起始字母=最新字母=无 对于字母,字母映射中的数字。items() 对于排序中的数字(数字): 如果最后的字母为“无”: 最后的字母=字母 起始数量=最新数量=数量 elif字母==最后的字母: 如果数字==最新数字+1: 最新数量=数量 其他: 添加结果(结果、最后一个字母、起始编号、最新编号) 起始数量=最新数量=数量 其他: 添加结果(结果、最后一个字母、起始编号、最新编号) 最后的字母=字母 起始数量=最新数量=数量 添加结果(结果、最后一个字母、起始编号、最新编号) 最终结果=','。连接(结果) 打印(最终结果)#F1-F3、F6、R1、R3、R341、C1-C2、C10、FL1、FL5

带整数字符串混合和组匹配问题的Python打印 重新导入 导入字符串 line=“F1、F2、F3、F6、R1、R3、R341、C1、C10、C2、FL1、FL5” 行(无数字=re.findall(“\D”,行)#生成一行,参考F、F、F、R、R、R、R、C、C、FL、FL 行无数字行字符串=“”。连接(映射(str,行无数字)) ############################################################# res=行\u无\u数字\u字符串。拆分(“,”) alpha_char_unique=[] 对于res中的i:#获取唯一的引用前缀 如果我不在alpha_char_unique中: alpha_char_unique.append(i) ############################################################# line2=行分割(“,”) preLine=“” result=“” 对于alpha_char_unique中的j: p=重新编译(j) 前置行=[s代表第2行中的s,如果p匹配] 如果重新搜索('\d+',l)不是None,则仅数字=[int(重新搜索('\d+',l).group(0)]用于前行中的l]#提取匹配项或前缀的数字,工作不正常 仅限数字。sort()#对数字进行排序以在下面的代码中工作 #打印(仅限数字) c=0#计数器 结果=“输出结果” 电流=无 运行=错误 x=len(仅限数字) 当c开始数量: 结果.追加(“%s%d-%s%d%”(最后\u个字母,起始\u个,最后\u个字母,最新\u个)) 其他: result.append(“%s%d%”(最后\u个字母,起始\u个)) 字母\u map=OrderedDict() 对于字母,数字以“([A-Z]+)(\\d+”)行显示: 数字=整数(数字) 如果不是字母图中的字母: 字母映射[字母]=[] 字母映射[字母]。追加(数字) 最后字母=起始字母=最新字母=无 对于字母,字母映射中的数字。items() 对于排序中的数字(数字): 如果最后的字母为“无”: 最后的字母=字母 起始数量=最新数量=数量 elif字母==最后的字母: 如果数字==最新数字+1: 最新数量=数量 其他: 添加结果(结果、最后一个字母、起始编号、最新编号) 起始数量=最新数量=数量 其他: 添加结果(结果、最后一个字母、起始编号、最新编号) 最后的字母=字母 起始数量=最新数量=数量 添加结果(结果、最后一个字母、起始编号、最新编号) 最终结果=','。连接(结果) 打印(最终结果)#F1-F3、F6、R1、R3、R341、C1-C2、C10、FL1、FL5,python,python-3.x,Python,Python 3.x,结果是 1,1-3,5-6 1,3,341 1-2,10 1,5 我希望是这样 F1-F3,F6 R1,R3,R341 C1-C2,C10 第1层,第5层 对此,匹配可能不是最好的。我正在寻找关于如何确保F1-F3和FL1、FL5不组合在一起的建议。我愿意接受建议。这就行了 重新导入 导入字符串 从集合导入订单 line=“F1、F2、F3、F6、R1、R3、R341、C1、C10、C2、FL1、FL5” 结果=[] def添加结果(结果、最后一个字母、起始编号、最新编号): 如果最后的字母为“

结果是 1,1-3,5-6 1,3,341 1-2,10 1,5 我希望是这样 F1-F3,F6 R1,R3,R341 C1-C2,C10 第1层,第5层

对此,匹配可能不是最好的。我正在寻找关于如何确保F1-F3和FL1、FL5不组合在一起的建议。我愿意接受建议。

这就行了

重新导入
导入字符串
从集合导入订单
line=“F1、F2、F3、F6、R1、R3、R341、C1、C10、C2、FL1、FL5”
结果=[]
def添加结果(结果、最后一个字母、起始编号、最新编号):
如果最后的字母为“无”:
返回
如果最新数量>开始数量:
结果.追加(“%s%d-%s%d%”(最后\u个字母,起始\u个,最后\u个字母,最新\u个))
其他:
result.append(“%s%d%”(最后\u个字母,起始\u个))
字母\u map=OrderedDict()
对于字母,数字以“([A-Z]+)(\\d+”)行显示:
数字=整数(数字)
如果不是字母图中的字母:
字母映射[字母]=[]
字母映射[字母]。追加(数字)
最后字母=起始字母=最新字母=无
对于字母,字母映射中的数字。items()
对于排序中的数字(数字):
如果最后的字母为“无”:
最后的字母=字母
起始数量=最新数量=数量
elif字母==最后的字母:
如果数字==最新数字+1:
最新数量=数量
其他:
添加结果(结果、最后一个字母、起始编号、最新编号)
起始数量=最新数量=数量
其他:
添加结果(结果、最后一个字母、起始编号、最新编号)
最后的字母=字母
起始数量=最新数量=数量
添加结果(结果、最后一个字母、起始编号、最新编号)
最终结果=','。连接(结果)
打印(最终结果)#F1-F3、F6、R1、R3、R341、C1-C2、C10、FL1、FL5
编辑: 对于您的评论中的修改版本,我认为您有几个输入错误:“R1,2”应该是“R1.2”,而“F2.,”应该是“F2”。如果不是打字错误,请告诉我。假设它们是,使其工作的最小更新是接受不仅仅是字母作为前缀,还允许以点结尾的尾随数字。也允许下划线。唯一需要更改的是re.findall行中的正则表达式

重新导入
导入字符串
从集合导入订单
line=“F1.1、F1.2、F1.3.F2、F3、F6、R1.1、R1.2、R1.3、R2、R3、R341、C1、C10、C2、FL_1、FL_5”
结果=[]
def添加结果(结果、最后一个字母、起始编号、最新编号):
如果最后的字母为“无”:
返回
如果最新数量>开始数量:
结果.追加(“%s%d-%s%d%”(最后\u个字母,起始\u个,最后\u个字母,最新\u个))
其他:
result.append(“%s%d%”(最后\u个字母,起始\u个))
字母\u map=OrderedDict()
对于字母,数字以“([A-Z]+{0,1}(?[0-9]+\\\){0,1})(\\d+”)行表示:
数字=整数(数字)
如果不是字母图中的字母:
字母映射[字母]=[]
字母映射[字母]。追加(数字)
最后字母=起始字母=最新字母=无
对于字母,字母映射中的数字。items()
对于排序中的数字(数字):
如果最后的字母为“无”:
最后的字母=字母
起始数量=最新数量=数量
elif字母==最后的字母:
如果数字==最新数字+1:
最新数量=数量
其他:
添加结果(结果、最后一个字母、起始编号、最新编号)
起始数量=最新数量=数量
其他:
添加结果(结果、最后一个字母、起始编号、最新编号)
最后的字母=字母
起始数量=最新数量=数量
添加结果(结果、最后一个字母、起始编号、最新编号)
最终结果=','。连接(结果)
打印(最终结果)F1.1-F1.3、F2-F3、F6、R1.1-R1.3、R2-R3、R341、C1-C2、C10、FL_1、FL_5```

Wow!这真令人印象深刻。马特,我遇到了新的挑战。如果字符串输入为“F1.1,F1.2,F1.3.F2.,F3,F6,R1.1,R1,2,R1.3,R2,R3,R341,C1,C10,C2,FL_1,FL_5”,并且我想要输出F,该怎么办
import re
import string
line = "F1,F2,F3,F6,R1,R3,R341,C1,C10,C2,FL1,FL5"

line_no_digits= re.findall("\D",line)#produce line with refernces F,F,F,F,R,R,R,C,C,C,FL,FL
line_no_digits_string= ''.join(map(str,line_no_digits))
#############################################################
res = line_no_digits_string.split(",")
alpha_char_unique=[]
for i in res:                      #get unique reference prefix
    if i not in alpha_char_unique:
        alpha_char_unique.append(i)
#############################################################
line2 = line.split(",")
preLine = ""
result = ""
for j in alpha_char_unique:
    p = re.compile(j)
    preLine = [s for s in line2 if p.match(s)]
    numbers_only = [int(re.search('\d+', l).group(0)) for l in preLine if re.search('\d+', l) is not None]#pull numbers for matches or prefix, not working correctly
    numbers_only.sort()#sort the numbers to work in code below
    #print(numbers_only)
    c = 0#counter
    result = ""#output result
    current = None
    run = False
    x = len(numbers_only)
    while c < x:#number sorter

        if current == None:
            result += f'{numbers_only[c]}'
        elif numbers_only[c] - current == 1:
            run = True
            if c == len(numbers_only) - 1:
                result += f'-{numbers_only[c]}'
        elif run:
            result += f'-{current},{numbers_only[c]}'
            run = False
        else:
            result += f',{numbers_only[c]}'

        current = numbers_only[c]
        c += 1
    print(result)