在Python中从字符串中删除EDIFACT消息

时间:2018-04-04 04:54:05

标签: python regex edifact

sample EDIFACT message看起来像这样:

UNB+AHBI:1+.? '
UNB+IATB:1+6XPPC:ZZ+LHPPC:ZZ+940101:0950+1'
UNH+1+PAORES:93:1:IA'
MSG+1:45'
IFT+3+XYZCOMPANY AVAILABILITY'
ERC+A7V:1:AMD'
IFT+3+NO MORE FLIGHTS'
ODI'
TVL+240493:1000::1220+FRA+JFK+DL+400+C'
PDI++C:3+Y::3+F::1'
!ERC+21198:EC'
APD+74C:0:::6++++++6X'
TVL+240493:1740::2030+JFK+MIA+DL+081+C'
PDI++C:4'
APD+EM2:0:1630::6+++++++DA'
UNT+13+1'
UNZ+1+1'

我需要创建一个从字符串中删除此类EDIFACT消息的正则表达式。它不应该丢失任何来自字符串的额外文本,因为它可能包含一些重要信息。例如,edifact可以嵌入文本中,如:

  

与团队讨论后,我们发现错误的组织片段已发送   edifact消息。您能否进一步调查为什么发送错误的ORG段。 [EDIFACT MESSAGE]
  尽快更新信息

有人可以为此创建正则表达式吗?

1 个答案:

答案 0 :(得分:0)

转到an EDIFACT format description,UNA部分是可选的,UNB是强制性的,因此任何一个都可以指示消息的开始。 UNZ部分是强制性页脚。考虑包含

的文件
First
UNA:+.? '
UNB+IATB:1+6XPPC:ZZ+LHPPC:ZZ+940101:0950+1'
UNH+1+PAORES:93:1:IA'
MSG+1:45'
...
UNZ+1+1'
Message
Second
UNB+AHBI:1+.? '
UNB+IATB:1+6XPPC:ZZ+LHPPC:ZZ+940101:0950+1'
UNH+1+PAORES:93:1:IA'
MSG+1:45'
...
UNZ+1+1'
Message

...与您的完整示例相似,这里有一些Python 3代码:

import re
import sys

regex = re.compile(r'(?:UNA.*?)?UNB.*?UNZ.*?(?:\r\n|\r|\n)', flags=re.DOTALL)
print(re.sub(regex, '', sys.stdin.read()), end='')

这里我假设UNZ部分一直持续到行尾,即使这可能不准确。也就是说,它似乎也有一个固定的格式,人们可以更精确地建模。

正则表达式本身的破败:

  • (?:UNA.*?)?是可选的UNA部分; UNA之后的部分可能有任何大小或格式,但应尽可能小。
  • UNB.*?是UNB的强制性部分;这标志着EDIFACT消息的开始,并且只要它一直持续到第一次出现UNZ。
  • UNZ.*?(?:\r\n|\r|\n)是强制性的UNZ部分;接下来是到达行尾的尽可能多的字符。由于这似乎是一种相当古老的格式,对于行结尾的类型保守可能是一件好事。 (\r\n是Windows,许多网络协议都是出于兼容性原因而尊重这一点,\r本身就是旧Mac,而\n是Unix)。
  • flags=re.DOTALL部分告诉Python的正则表达式引擎将换行符包含在" ."。

在此处运行此脚本会给出:

First
Message
Second
Message