Python字符串转换

时间:2017-12-23 22:16:55

标签: python regex string

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

abranch

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

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

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

我研究,测试过,并且卡住了。

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

非常感谢任何帮助!

由于

3 个答案:

答案 0 :(得分: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(这可以做到,但是以更复杂的方式),它就不能很好地工作了

答案 1 :(得分: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

答案 2 :(得分: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