2

我需要关于 re 模块的帮助。我有模式:

pattern = re.compile('''first_condition\((.*)\)
extra_condition\((.*)\)
testing\((.*)\)
other\((.*)\)''', re.UNICODE)

如果我对以下文本运行正则表达式,就会发生这种情况:

text = '''first_condition(enabled)
extra_condition(disabled)
testing(example)
other(something)'''
result = pattern.findall(text)
print(result)
[('enabled', 'disabled', 'example', 'something')]

但是如果遗漏了一两行,正则表达式会返回空列表。例如我的文字是:

text = '''first_condition(enabled)
other(other)'''

我想得到什么:

[('enabled', '', '', 'something')]

我可以在几个命令中执行此操作,但我认为它会比在一个正则表达式中执行此操作要慢。原始代码使用sed,所以速度非常快。我可以使用 sed 来做到这一点,但我需要跨平台的方式来做到这一点。有可能吗?坦克!

PS如果字符串序列是免费的,而不是固定的,那也很棒:

text = '''other(other)
first_condition(enabled)'''

必须返回完全相同:

[('enabled', '', '', 'something')]
4

2 回答 2

4

我会先将其解析为字典:

import re

keys = ['first_condition', 'extra_condition', 'testing', 'other'] 
d = dict(re.findall(r'^(.*)\((.*)\)$', text, re.M))
result = [d.get(key, '') for key in keys]

在线查看它:ideone

于 2012-05-17T21:27:15.523 回答
0

对可选内容使用不匹配的组,并通过在组后放置问号使组成为可选。

例子:

pat = re.compile(r'a\(([^)]+)\)(?:b\((?P<bgr>[^)]+)\)?')

抱歉,我现在无法对此进行测试。

上面需要一个字符串a(foo),并将父母中的文本作为第 0 组。

然后它可以选择匹配一个字符串b(foo),如果匹配,它将被保存为具有名称的命名组:bgr

请注意,我没有.*在括号内使用匹配,而是[^)]+. 这肯定会在到达结束括号时停止匹配,并且至少需要一个字符。[^)]*如果括号可以为空,则可以使用。

这些模式变得越来越复杂,因此您可能希望使用带有注释的详细模式。

要拥有几个可能以任何顺序出现的可选模式,请将它们全部放在一个不匹配的组中,并用竖线分隔它们。您将需要使用命名匹配组,因为您不知道顺序。在不匹配组之后放置一个星号以允许存在任意数量的替代模式(如果不存在,则包括零)。

于 2012-05-17T21:22:36.237 回答