Python:正则表达式:查找是否存在,否则忽略

时间:2012-05-17 21:17:07

标签: python regex

我需要帮助重新模块。我有模式:

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来做,但我需要跨平台的方式来做到这一点。有可能吗? Tnanks!

P.S。如果字符串序列是免费的,而不是固定的话,也会很棒:

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

必须完全相同:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用不匹配的组作为可选内容,并通过在组后面添加问号使该组成为可选项。

示例:

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

很抱歉,我现在无法测试。

上述内容需要a(foo)之类的字符串,并将父项中的文本作为组0抓取。

然后它可选地匹配像b(foo)这样的字符串,如果匹配,它将被保存为名称为bgr的命名组

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

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

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