-1

示例 EDIFACT 消息如下所示:

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]
尽快更新信息

任何人都可以帮助创建一个正则表达式吗?

4

1 回答 1

0

回顾EDIFACT 格式描述,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
于 2018-04-04T06:59:10.630 回答