【问题标题】:Split text using any suggested method使用任何建议的方法拆分文本
【发布时间】:2016-07-26 14:23:07
【问题描述】:

我有这样的纯文本:

Cart ID: A3N42M / Copy: A3N42P PO: 5000021337 Invoice: 3110021337
Cart ID: A3N3ZW / Copy: A3N3ZX/ PO: 5000021335 Invoice: 3110021335 
Cart ID: A3N3ZL / Copy: A3N3ZM PO: 5000021336 Invoice: 3110021336 
Original: A3N444 / Copy: A3N445 PO: 5000021340 Invoice: 3130021340
Original: A3N44C / Copy: A3N44D PO: 5000021341 Invoice: 3130021341
Original: A3N44G / Copy: A3N44H PO: 5000021342 Invoice: 3130021342
Cart ID: A3N3ZZ / Copy: A3N428 PO: A3N3ZZ01
Cart ID: A3N3ZQ / Copy: A3N3ZV PO: A3N3ZQ01
Cart ID: A3N336 / Copy: A3N337 PO: A3N33601
E3M49D / E3M49Q - PO: 4620028049
E3M49N / E3M49X
E3M49P / E3M49Y

我需要从该文本中拆分购物车 ID,并最终得到如下内容:

A3N42M
A3N42P
A3N3ZW
...
E3M49N
...

这些 ID 始终为 6 位长度,并且始终以 AEPAXXXXXEXXXXXPXXXXX 等...)开头。

有什么方法(使用任何脚本或任何程序语言)可以实现这一点吗?

此纯文本当前位于电子表格中,我需要将这些 ID 分开以供稍后在 SQL 查询中使用,谢谢!

【问题讨论】:

  • 几乎每一种语言都可以做到这一点,如果有的话,你知道什么语言或者你更喜欢用什么语言工作?
  • 如果你使用 python 查看splitregex
  • 其实我只是有一个非常基本的程序语言知识,一点点Java……但还不足以尝试实现这一点
  • 您还可以使用带有正则表达式查找和替换的文本编辑器来执行拆分。
  • 你用什么文本编辑器?

标签: sql split data-munging


【解决方案1】:

正则表达式数据处理


您可以通过regex 替换(或查找和替换)来执行此操作。我碰巧在 python 中执行此操作,但您可以在任何支持它们的语言或文本编辑器中使用相同的正则表达式模式('^[^/]*?: ''/.*')。

正则解释

  1. '^[^/]*?: ' - 字符串的开头和开头(第一个^),以非贪婪方式匹配多个非\ 字符([^/]*?]),一个:,然后一个
  2. '/.*' - 匹配所有 /,然后是多个任意字符 (.)

处理示例(在 Python 中)

import re

text = '''
Cart ID: A3N42M / Copy: A3N42P PO: 5000021337 Invoice: 3110021337
Cart ID: A3N3ZW / Copy: A3N3ZX/ PO: 5000021335 Invoice: 3110021335 
Cart ID: A3N3ZL / Copy: A3N3ZM PO: 5000021336 Invoice: 3110021336 
Original: A3N444 / Copy: A3N445 PO: 5000021340 Invoice: 3130021340
Original: A3N44C / Copy: A3N44D PO: 5000021341 Invoice: 3130021341
Original: A3N44G / Copy: A3N44H PO: 5000021342 Invoice: 3130021342
Cart ID: A3N3ZZ / Copy: A3N428 PO: A3N3ZZ01
Cart ID: A3N3ZQ / Copy: A3N3ZV PO: A3N3ZQ01
Cart ID: A3N336 / Copy: A3N337 PO: A3N33601
E3M49D / E3M49Q - PO: 4620028049
E3M49N / E3M49X
E3M49P / E3M49Y
'''

text = re.sub('^[^/]*?: ([]*?)', '', text, flags=re.MULTILINE)
text = re.sub('/.*', '', text)

print text

A3N42M 
A3N3ZW 
A3N3ZL 
A3N444 
A3N44C 
A3N44G 
A3N3ZZ 
A3N3ZQ 
A3N336 
E3M49D 
E3M49N 
E3M49P

编辑


更新正则表达式说明

根据作者的要求更新了regex

  1. 匹配任意字符 (.*?)(非贪婪),后跟一个字符类 ([AEP]) 的捕获组 ((...)),后跟至少一个字符类 ([0-9]+)由四个单词字符 (\w{4}),然后是另一个任意字符的捕获组 ((.*))
  2. 所有这些都匹配并替换为捕获组变量,中间有一个换行符 (\1\n\2),实质上是拆分 ID 出现两次的行
  3. 仅对第一个捕获组重复步骤以处理包含第二个 ID 的换行符

更新处理

text = re.sub(r'.*?([AEP][0-9]+\w{4})(.*)', r'\1\n\2', text, flags=re.MULTILINE)
text = re.sub(r'.*?([AEP][0-9]+\w{4}).*', r'\1', text, flags=re.MULTILINE)

print text

A3N42M
A3N42P
A3N3ZW
A3N3ZX
A3N3ZL
A3N3ZM
A3N444
A3N445
A3N44C
A3N44D
A3N44G
A3N44H
A3N3ZZ
A3N428
A3N3ZQ
A3N3ZV
A3N336
A3N337
E3M49D
E3M49Q
E3M49N
E3M49X
E3M49P
E3M49Y

【讨论】:

  • 您好,我安装了 Python 并尝试使用命令提示符运行 .py 文件,但我得到了这个:SyntaxError: Missing parentheses in call to 'print',我做错了什么吗?抱歉之前没有玩过 Python,我只是在命令提示符下运行:python file.py
  • 如果你有 Python 3,请使用 print(text)
  • 谢谢!它几乎成功了,只是在文本中/ 之后缺少一些 ID,正如您在此 Image 中看到的那样。
  • 感谢您的链接,我做了一些研究,我可以想出一个在列表中找到我所有购物车 ID 的正则表达式:(a|e|p)[0-9]{1,}\w{4} -- IMAGE -- 现在,是吗可能在那个 python 代码中使用这个正则表达式并删除所有不匹配的东西?
  • 非常感谢!像魅力一样工作,我接受了您的帖子作为答案,由于我的声誉,我无法投票,抱歉耽搁了! :-)