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]
尽快更新信息
有人可以为此创建正则表达式吗?
答案 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