【问题标题】:Split string using python and regex使用 python 和正则表达式拆分字符串
【发布时间】:2017-04-06 10:27:56
【问题描述】:

我有以下 csv 文件:

NAME   DETAILS
abc    type1: Y, Property: p1,p3 , type2:N
def    type1: Y, Property: p2,p3 , type2:N
ghi    type1: N, Property: p1,p2 , type2:Y
jkl    type1: N, Property: p1,p3 , type2:Y

我希望输出文件为:

NAME type1 Property type2
abc  Y      p1,p3    N
def  Y      p2,p3    N
ghi  N      p1,p2    Y
jkl  N      p1,p3    Y

使用 python 和正则表达式,如果我根据 '' 拆分详细信息列,则属性类型将拆分为单独的列。有没有办法处理这种情况?

【问题讨论】:

  • csv 模块在这里没有用吗? docs are here
  • 每行总是有 2 个属性吗?
  • 无论如何,它似乎不是 csv,因为每行的前两个值不是逗号分隔的。

标签: python regex string csv


【解决方案1】:

有很多方法可以做到这一点,但我会在任何标点符号/空白字符上分割每一行,然后根据您的需要手动重建它:

import re 

t = """abc    type1: Y, Property: p1,p3 , type2:N
def    type1: Y, Property: p2,p3 , type2:N
ghi    type1: N, Property: p1,p2 , type2:Y
jkl    type1: N, Property: p1,p3 , type2:Y""".split('\n')

for x in t:
    y = re.findall(r"[\w']+", x)
    #print y
    print '\t'.join((y[0],y[2],y[4]+','+y[5],y[7]))

> abc   Y   p1,p3   N
> def   Y   p2,p3   N
> ghi   N   p1,p2   Y
> jkl   N   p1,p3   Y

没有正则表达式的另一种方法是替换所有定界字符,然后自动重建。像这样的:

print [x.replace(':','\t').replace(' , ','\t').split() for x in t]

【讨论】:

    【解决方案2】:

    使用正则表达式和组捕获来提取数据的示例脚本

    脚本.py

    #!/usr/bin/env python
    
    import re,sys
    
    def main():
        p = re.compile("([a-z]+).*type1:\s+([A-Z]),\s+Property:\s+?([a-z0-9,]+)\s+,\s+?type2:([A-Z])")
    
        for line in sys.stdin:
            m = p.match(line)
            if m:   
                print "\t".join([m.group(1), m.group(2), m.group(3), m.group(4)])
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多