我需要帮助重新模块。我有模式:
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')]
答案 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可以为空,您可以使用[^)]*
。
这些模式变得越来越复杂,因此您可能希望使用带有注释的详细模式。
要有多个可能以任何顺序出现的可选图案,请将它们全部放在不匹配的组中,然后用竖线分隔它们。您将需要使用命名匹配组,因为您不知道订单。在非匹配组后面加上一个星号,以允许存在任意数量的替代模式(如果不存在,则包括零)。