Python字符串转换

问题描述 投票:1回答:3

这是我通过解析文件中的数据创建的字符串:

723|NM|1|7201|QQ|1|72034|PP|1|72034N|AA|1|7203466|QW|1|72000|NM|1|7201111|NM|1

理想情况下,我想要这个输出:

723|NM|1
7201|QQ|1
72034|PP|1
72034N|AA|1
7203466|QW|1
72000|NM|1
7201111|NM|1

因为我没有成功解析数据并动态附加它(我是python的新手)我明白我可以通过转换这个字符串获得相同的所需输出。

我研究,测试,卡住了。

基本上我需要用新行代替分隔符的每个第3个实例(或者,也许是任何人都可以建议的更好的东西)。

任何帮助是极大的赞赏!

谢谢

python regex string
3个回答
5
投票

没有正则表达式:

像这样:

s = "723|NM|1|7201|QQ|1|72034|PP|1|72034N|AA|1|7203466|QW|1|72000|NM|1|7201111|NM|1"

items = s.split("|")
print("\n".join(["|".join(items[i:i+3]) for i in range(0,len(items),3)] ))

注意外部[]内部的join是故意的,以获得更好的性能(List comprehension without [ ] in Python)(即使我同意它是丑陋:))

结果:

723|NM|1
7201|QQ|1
72034|PP|1
72034N|AA|1
7203466|QW|1
72000|NM|1
7201111|NM|1

BTW与正则表达式也很简单:

re.sub("(.*?\|.*?\|.*?)\|","\\1\n",s)

但如果物品的数量不能完全分割为3(这可以做到,但是以更复杂的方式),它就不能很好地工作


0
投票

使用正则表达式解决方案:

import re

string = """723|NM|1|7201|QQ|1|72034|PP|1|72034N|AA|1|7203466|QW|1|72000|NM|1|7201111|NM|1
723|NM|1|7201|QQ|1|72034|PP|1|72034N|AA|1|7203466|QW|1|72000|NM|1|7201111|NM|1|123|NM"""

rx = re.compile(r'(?:[^|]+\|?){1,3}')

for line in string.split("\n"):
    parts = "\n".join([part.group(0).rstrip("|") for part in rx.finditer(line)])
    print(parts)

这会产生:

723|NM|1
7201|QQ|1
72034|PP|1
72034N|AA|1
7203466|QW|1
72000|NM|1
7201111|NM|1
723|NM|1
7201|QQ|1
72034|PP|1
72034N|AA|1
7203466|QW|1
72000|NM|1
7201111|NM|1
123|NM

a demo on regex101.com


0
投票

您可以使用正则表达式并尝试此模式:

import re

pattern=r'\d+\w\|\w+\|\d'
with open('file.txt','r') as f:
    for line in f:
        match=re.findall(pattern,line)
        for i in match:
            print(i)

输出:

723|NM|1
7201|QQ|1
72034|PP|1
72034N|AA|1
7203466|QW|1
72000|NM|1
7201111|NM|1

只为了一行乐趣:

import re

pattern=r'\d+\w\|\w+\|\d'
for i in [re.findall(pattern,line) for line in open('file.txt','r')][0]:
    print(i)

输出:

723|NM|1
7201|QQ|1
72034|PP|1
72034N|AA|1
7203466|QW|1
72000|NM|1
7201111|NM|1
© www.soinside.com 2019 - 2024. All rights reserved.