我有一个巨大的txt文件,它有以下格式:
BadLine
property1=a
property2=b
BadLine2
property1=c
property2=d
GOODLINE1
property1=e
property2=f
....以及更多好的和坏的线。
我需要做的是提取好线的属性(上例中的e和f)。
我可以很容易地在我的文件中找到好的行,但是如何选择仅在与好处相关联的块中搜索其他正则表达式的属性?
谢谢你们!
答案 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'