从 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
一个 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