仅在两个字符串模式之间复制字符串

时间:2018-10-23 14:15:55

标签: python regex

测试一些正则表达式代码。我认为它应该看起来像这样。

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'

2 个答案:

答案 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)