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

2024-04-25 14:42:30 发布

您现在位置: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

有人能帮我创建一个正则表达式吗?你知道吗


Tags: 字符串文本messagedlapdpdiiftwrong
1条回答
网友
1楼 · 发布于 2024-04-25 14:42:30

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

...与您的完整示例相当,下面是一些python3代码:

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)。你知道吗
  • ^{}部分告诉Python的regex引擎将换行作为“.”的一部分。你知道吗

在此处运行此脚本将提供:

First
Message
Second
Message

相关问题 更多 >