根据python中的每个正则表达式匹配创建新行

时间:2014-10-21 00:03:33

标签: python regex

我的输入文件包含如下格式的数据:

一个; b,c | derp derp" X1234567,Y1234567,Z1234567" derp derp a; b,c |

我想使用Python将其解析为双引号之间的每个项目的多行。

以上示例的输出为:

一个; b,c | derp derp X1234567 derp derp a; b,c |

一个; b,c | derp derp Y1234567 derp derp a; b,c |

一个; b,c | derp derp Z1234567 derp derp a; b,c |

到目前为止,我有这样的事情:

import re
prefix = re.compile ('^(.*?)"')
pattern = re.compile('\"(.*?)([A-Z]{1}[0-9]{7})(.*?)\"')
suffix = re.compile ('"(.*?)$')
for i, line in enumerate(open('myFile.txt')):
    for match in re.finditer(pattern, line):
        print prefix, match.group(), suffix

但它似乎只返回每个内容的第一场比赛。

1 个答案:

答案 0 :(得分:0)

在这种情况下,使用正则表达式而不是简单的字符串和列表操作实际上有很多工作(在我看来)。我会这样做:

#!/usr/bin/env pytohn

with open('myFile.txt','r') as f:
    lines = readlines(f)

for line in lines:
    line = line.strip()
    start = line.find('"')
    end = line.find('"',start+1)
    data = line[start+1:end].split(',')
    data = [x.strip() for x in data]
    for x in data:
        print line[:start],x,line[end+1:]

这是我在查看您发布的代码后发现的内容:

  • 您实际上在打印行中打印SRE_Patternprefix的{​​{1}}个对象。您应该在外部for循环的每次迭代中记录前缀和后缀的匹配。
  • 调用suffix将返回整个匹配,而不仅仅是括号中的内容。我认为在大多数情况下你想要match.group()
  • match.group(1)定义为只匹配一个字符串,因为它会在行中依次搜索起始引号,然后是模式的其余部分。因此,它到达第一个引号的索引,检查一次模式,找到pattern然后继续。
  • 我不确定为什么在X1234567中的引号之前有反斜杠,因为我不认为这些是特殊字符。
  • pattern中,它会匹配第一个引号而不是第二个引号,因此suffix将包含引号之间的内容。
  • 如果您使用逗号,print语句将在项之间插入空格,因此您应该使用suffix来连接它们。

最后,这就是我最终的正则表达式:

+

希望这有帮助,请问任何问题。在最好的时候,正则表达式是一个棘手的野兽。