如何使用python以通用方式拆分字符串数据?

时间:2019-02-19 07:01:05

标签: python regex split

import re

input_data = 'ABCD:AKSHAYTAB:INDIAN ARMYWXYZ:1234-M234656VXYZ:45666Gb4565UXYZ:45535353TIME:17:20OBTRL:346644MNP2:PUNE UNIVERCITYMNP3:SATARA PUNEMNP6:46564PQR2:AMAR GODASEEPQR3:PUNE 3545 LIIS1:467574IIS2:BANK OF INDIAABK1:56365ABK2:KOREGAON SATARAMTL: BEM:56546445745/PPI:MMC:AJINKYA DALAVI.FFC XYZ: SUMIT GODASE SATARAPPI:CNF:ANTARES HOLDINGS LP/AC-50293315'

tag_list = ["ABCD", "TAB", "WXYZ", "VXYZ", "UXYZ", "TIME", "OBTRL", "MNP2", "MNP3", "MNP6", "PQR2", "PQR3", "IIS1", "IIS2", "ABK1", "ABK2", "MTL", "BEM", "PPI", "MMC", "XYZ", "PPI", "CNF"]

for each_tag in tag_list:
 print(each_tag)
 input_data = re.sub(r"(?<![A-Z])"+each_tag, "|" + each_tag, input_data)

print(input_data)

预期的输出量:-

'|ABCD:AKSHAY|TAB:INDIAN ARMY|WXYZ:1234-M234656|VXYZ:45666Gb4565|UXYZ:45535353|TIME:17:20|OBTRL:346644|MNP2:PUNE UNIVERCITY|MNP3:SATARA PUNE|MNP6:46564|PQR2:AMAR GODASEE|PQR3:PUNE 3545 L|IIS1:467574|IIS2:BANK OF INDIA|ABK1:56365|ABK2:KOREGAON SATARA|MTL: |BEM:56546445745/|PPI:|MMC:AJINKYA DALAVI.FFC |XYZ: SUMIT GODASE SATARA|PPI:|CNF:ANTARES HOLDINGS LP/AC-50293315'

但是我在拆分时遇到错误,请检查以下错误输出

错误输出:-

|ABCD:AKSHAYTAB:INDIAN ARMYWXYZ:1234-M234656|VXYZ:45666Gb4565|UXYZ:45535353|TIME:17:20|OBTRL:346644|MNP2:PUNE UNIVERCITYMNP3:SATARA PUNEMNP6:46564|PQR2:AMAR GODASEEPQR3:PUNE 3545 LIIS1:467574|IIS2:BANK OF INDIAABK1:56365|ABK2:KOREGAON SATARAMTL: |BEM:56546445745/||PPI:|MMC:AJINKYA DALAVI.FFC |XYZ: SUMIT GODASE SATARAPPI:|CNF:ANTARES HOLDINGS LP/AC-50293315

如何解决此错误,请让我知道代码中的错误之处? 请检查下面的图像,我有黄色突出显示了我得到错误的部分 enter image description here

3 个答案:

答案 0 :(得分:0)

因为标记可以相互包含(例如'XYZ'出现在'WXYZ'中),所以必须这样做。请注意,如果数据中标记的顺序不同于tag_list,则此解决方案将失效。如果您能以某种方式删除有问题的标签,则可以将其缩短。

它使用正则表达式在数据中找到<tag>:(并且标记必须与tag_list中的顺序相同(如上所述)),然后在匹配之前添加"|"。然后,它会切断已处理的标签,以阻止重复标签或彼此包含的标签出现问题,并将缩短的字符串用于下一个标签。

最后,它将字符串重新连接在一起以获得最终结果。

import re

input_data = 'ABCD:AKSHAYTAB:INDIAN ARMYWXYZ:1234-M234656VXYZ:45666Gb4565UXYZ:45535353TIME:17:20OBTRL:346644MNP2:PUNE UNIVERCITYMNP3:SATARA PUNEMNP6:46564PQR2:AMAR GODASEEPQR3:PUNE 3545 LIIS1:467574IIS2:BANK OF INDIAABK1:56365ABK2:KOREGAON SATARAMTL: BEM:56546445745/PPI:MMC:AJINKYA DALAVI.FFC XYZ: SUMIT GODASE SATARAPPI:CNF:ANTARES HOLDINGS LP/AC-50293315'

tag_list = ["ABCD", "TAB", "WXYZ", "VXYZ", "UXYZ", "TIME", "OBTRL", "MNP2", "MNP3", "MNP6", "PQR2", "PQR3", "IIS1", "IIS2", "ABK1", "ABK2", "MTL", "BEM", "PPI", "MMC", "XYZ", "PPI", "CNF"]

t = []
for tag in tag_list:
    m = r"(" + tag + ":)"
    tmp = re.sub(m, r"|\1", input_data)
    end = tmp.find("|"+tag) + len("|"+tag)
    input_data = input_data[end:]
    t.append(tmp[:end+1])
t.append(input_data)
done = "".join(t)
expected = '|ABCD:AKSHAY|TAB:INDIAN ARMY|WXYZ:1234-M234656|VXYZ:45666Gb4565|UXYZ:45535353|TIME:17:20|OBTRL:346644|MNP2:PUNE UNIVERCITY|MNP3:SATARA PUNE|MNP6:46564|PQR2:AMAR GODASEE|PQR3:PUNE 3545 L|IIS1:467574|IIS2:BANK OF INDIA|ABK1:56365|ABK2:KOREGAON SATARA|MTL: |BEM:56546445745/|PPI:|MMC:AJINKYA DALAVI.FFC |XYZ: SUMIT GODASE SATARA|PPI:|CNF:ANTARES HOLDINGS LP/AC-50293315'
print(done == expected)

没有问题标记的for循环可以缩短为:

for tag in tag_list:
    m = r"(" + tag + ":)"
    input_data = re.sub(m, r"|\1", input_data)

如果标签的顺序在数据中不同,或者标签出现在数据的其他位置(例如,作为名称的一部分),则此解决方案将严重中断。

答案 1 :(得分:0)

实际上,您的转换可以通过以下方式描述:

  • tag_list中查找每个标签(后跟“:”)。
  • 在其前面插入|

因此,您应将正则表达式构造为tag_list的联接,并以|作为分隔符(每个标记都是替代的)。 更准确地说,每个替代项都应以':'结尾。

然后,您应该用|\g<0>(竖线 +对整个比赛的反向引用。

因此在 Python 中,它可以表示为:

pat = '|'.join([ re.escape(s) + ':' for s in tag_list ])
result = re.sub(pat, r'|\g<0>', input_data)

请注意,为避免正则表达式特殊字符在 您的标签,我添加了re.escape

我认为您的标记(后跟冒号)不会出现在其他位置。

答案 2 :(得分:0)

几乎完整的解决方案可能是这样的:

import re

input_data = 'ABCD:AKSHAYTAB:INDIAN ARMYWXYZ:1234-M234656VXYZ:45666Gb4565UXYZ:45535353TIME:17:20OBTRL:346644MNP2:PUNE UNIVERCITYMNP3:SATARA PUNEMNP6:46564PQR2:AMAR GODASEEPQR3:PUNE 3545 LIIS1:467574IIS2:BANK OF INDIAABK1:56365ABK2:KOREGAON SATARAMTL: BEM:56546445745/PPI:MMC:AJINKYA DALAVI.FFC XYZ: SUMIT GODASE SATARAPPI:CNF:ANTARES HOLDINGS LP/AC-50293315'

tag_list = ["ABCD", "TAB", "WXYZ", "VXYZ", "UXYZ", "TIME", "OBTRL", "MNP2", "MNP3", "MNP6", "PQR2", "PQR3", "IIS1", "IIS2", "ABK1", "ABK2", "MTL", "BEM", "PPI", "MMC", "XYZ", "PPI", "CNF"]

outp = []

l = len(tag_list)
for i in range (0, l-1):
 start_tag = tag_list[i]+":"
 end_tag = tag_list[i+1]+":"
 d = re.findall(r''+start_tag+'(.+?)'+end_tag , input_data)
 if len(d) == 0:
   d = [""]
 outp.append([ tag_list[i],d[0]])


print(outp)