测试一些正则表达式代码。我认为它应该看起来像这样。
r'\stable_name:\s+([a-z _1-9]+)\n (.*?)\sid: validate'
results = re.findall(r'\stable_name:\s+([a-z _1-9]+)\n (.*?)\sid: validate',lines,flags=re.DOTALL)
但是我没有得到任何结果。我得到的只是这个错误:AttributeError: 'tuple' object has no attribute 'replace'
答案 0 :(得分:2)
因此,例如:
lines = """table_name: snl_realestate_pricing_eap_pricechanges
some text here...
id: validate
table_name: snl_realestate_pricing_eap_return_5y
some text here...
id: validate
table_name: snl_realestate_pricing_eap_rates_10yrnote
some text here...
id: validate"""
正则表达式给我:
results = re.findall(r'table_name:\s+([a-z _1-9\n]+\sid: validate',lines,flags=re.DOTALL)
>>> results
[('snl_realestate_pricing_eap_pricechanges', 'some text here...'), ('snl_realestate_pricing_eap_return_5y', 'some text here...')]
这会生成元组,您(我认为)尝试做类似results[0].replace()
的操作,但由于错误而失败
更改正则表达式可以使我:
results = re.findall(r'table_name:\s+(.*?)\sid: validate',lines,flags=re.DOTALL)
>>> results
['snl_realestate_pricing_eap_pricechanges\nsome text here...', 'snl_realestate_pricing_eap_return_5y\nsome text here...', 'snl_realestate_pricing_eap_rates_10yrnote\nsome text here...']
如果您想分手,可以映射一个拆分,或者在做其他事情时可以原封不动地使用它。
>>> list(map(lambda x: x.split("\n"), results))
[['snl_realestate_pricing_eap_pricechanges', 'some text here...'], ['snl_realestate_pricing_eap_return_5y', 'some text here...'], ['snl_realestate_pricing_eap_rates_10yrnote', 'some text here...']]
如果您想摆脱一定数量的行,可以这样做:
new_results = list()
for res in map(lambda x: x.split("\n"), results)
try:
new_results.append([res[0]] + res[8:])
except IndexError:
continue
这应该保留第一行以及第9行及以上的所有内容。用纯正则表达式来执行所需的操作可能会很困难,因此,在获取所需的字符串块后的处理过程中,我会这样做。
答案 1 :(得分:1)
results = re.findall(r'table_name:\s+([a-z _0-9]+)\n(.*?)\sid: validate',lines,flags=re.DOTALL)