【问题标题】:Remove EDIFACT messages from string in Python [duplicate]从 Python 中的字符串中删除 EDIFACT 消息 [重复]
【发布时间】:2018-09-13 13:05:58
【问题描述】:

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 可以嵌入到如下文本中:

在与团队讨论后,我们发现发送了错误的组织段 编辑消息。您能否进一步调查为什么发送了错误的 ORG 段。 [编辑留言]
尽快更新信息

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

【问题讨论】:

  • stackoverflow.com/help/how-to-askstackoverflow.com/help/mcve ... 1) 减少样本量,几行表明问题就足够了... 2) 为给定样本添加完整的预期输出 3) 添加什么你已经尝试过自己解决它
  • 对不起,先生,如果我无法向您说明问题。 @Sundeep
  • 别抱歉:更新问题! :)
  • 它们以什么方式嵌入到字符串中?它们是否总是以明文形式显示,EDIFACT 消息是否总是以自己的行开头并且开头不包含空格缩进?
  • @SimonShine 是的,先生,它们总是纯文本格式。它可能会或可能不会以新行开头,并且可以在开头包含空格缩进。

标签: python regex edifact


【解决方案1】:

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

...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 部分一直持续到行尾,即使这可能不准确。也就是说,它似乎也有一种可以更精确建模的固定格式。

正则表达式本身的失败:

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

【讨论】:

  • 谢谢,真的很有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2012-05-06
相关资源
最近更新 更多