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

Remove EDIFACT messages from string in Python

一个 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 可以像这样嵌入文本中:

After discussing with team we found that wrong org segment sent in edifact message. Can you please investigate further why wrong ORG segment is sent. [EDIFACT MESSAGE]
Update information as quickly as possible

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

继续 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

with ...s 可与您的完整示例相媲美,这里有一些 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 部分一直持续到行尾,尽管这可能不准确。也就是说,它似乎也有一种可以更精确地建模的固定格式。

正则表达式本身的run-down:

  • (?: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