Python正则表达式:如何处理行

2024-09-30 22:11:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

……还有更多的好的和坏的台词。你知道吗

我需要做的是提取好的行的属性(上面例子中的e和f)。你知道吗

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

谢谢你们!你知道吗


Tags: 文件txt属性格式例子台词property1property2
2条回答

简而言之,你可以告诉我们:

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

在本例中,两个括号将是您要查找的值。如果在以windows/mac样式创建的文件中有字符串,则会有不同的结束字符:windows中的“\r\n”和mac中的“\r”。在linux系统中,只有'\n'。上面的模式将与字符串开头或结尾的任何一行匹配,即使结尾没有任何换行符。属性中的值也可以是多个字符。你知道吗

您可以尝试一个非常有用的网站Pythex来尝试正则表达式。你知道吗

您可以尝试的代码是:

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'

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

[('e', 'f'), ('eee34', 'f00'), ('e', 'f')]

以下代码:

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包解析是否满足您的需要这看起来像是一个可以轻松解析的文件。你知道吗

相关问题 更多 >