Python RegEx:如何处理行

时间:2015-08-19 00:41:02

标签: python regex lines

我有一个巨大的txt文件,它有以下格式:

BadLine
      property1=a
      property2=b
BadLine2
      property1=c
      property2=d
GOODLINE1
      property1=e
      property2=f

....以及更多好的和坏的线。

我需要做的是提取好线的属性(上例中的e和f)。

我可以很容易地在我的文件中找到好的行,但是如何选择仅在与好处相关联的块中搜索其他正则表达式的属性?

谢谢你们!

2 个答案:

答案 0 :(得分:1)

以下代码:

import re

test = '''
BadLine
      property1=a
      property2=b
BadLine2
      property1=c
      property2=d
GOODLINE1
      property1=e
      property2=f
BadLine
      property1=a
      property2=b
BadLine2
      property1=c
      property2=d
GOODLINE2
      property1=e
      property2=f
'''

pattern = r'^(GOODLINE(?:[^\n]|\n )*)'

print re.compile(pattern, re.MULTILINE).findall(test)

产生这些结果:

['GOODLINE1\n      property1=e\n      property2=f', 'GOODLINE2\n      property1=e\n      property2=f']

模式匹配出现在一行开头的“GOODLINE”,以及其后不是换行符的贪婪匹配字符,以及后跟空格字符的换行符。如果您的文本实际上包含换行符后的制表符而不是空格,则可以将空格更改为制表符。或者,您可以通过更改模式轻松匹配:

pattern = r'^(GOODLINE(?:[^\n]|\n[ \t])*)'

获得这些匹配后,使用常规字符串split()非常容易提取属性。

或者,您可以看到rson包解析是否满足您的需求 - 这看起来像一个可以轻松解析的文件。

答案 1 :(得分:0)

简短的回答是你可以:

public class Otherhandlerclass implements ActionListener {

    public void actionPerformed(ActionEvent e) {

        dispose();
        JOptionPane.showMessageDialog(null, "Since you pressed that button, I will open a new window when you press ok, okay?");

        sinceyoupressedthecoolbutton();
    }

    public void sinceyoupressedthecoolbutton() {

        JDialog YES = new JDialog();
        JLabel label = new JLabel("Here is that new window I promised you!");
        YES.add(label);
        YES.setSize(500, 500);
        YES.setVisible(true);

    }

    public class okay implements ActionListener {

        public void actionPerformed(ActionEvent ok) {

        }

    }

}

在这种情况下,两个括号将是您要查找的值。如果你在一个以windows / mac风格创建的文件中有字符串,你将有不同的结束字符:windows中的'\ r \ n'和mac中的'\ r'。在linux系统中,你只有'\ n'。上面的模式将匹配字符串开头或结尾的任何Goodline,即使最后没有任何换行符。您在属性中的值也可以是多个字符。

您可以尝试使用非常有用的网站Pythex来试用正则表达式。

您可以尝试的代码是:

GOODLINE[\d+]*\n.*property1=(.+)*\n.*property2=(.+)*\n?

您将在列表中获得以下结果,每个对都是property1和property2值:

import re
pattern = re.compile('GOODLINE[\d+]*\n.*property1=(.+)*\n.*property2=(.+)*\n?')
matchRes = re.findall(pattern,'''BadLine2
      property1=c
      property2=d
GOODLINE11
      property1=e
      property2=f
BadLine2
      property1=c
      property2=d
GOODLINE11
      property1=eee34
      property2=f00
BadLine2
      property1=c
      property2=d
GOODLINE1
      property1=e
      property2=f''');

if matchRes:
    print matchRes
else:
    print 'No match'