首页 > 解决方案 > 仅复制两个字符串模式之间的字符串

问题描述

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

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'

标签: pythonregex

解决方案


因此,例如:

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 行及以上的任何内容。用纯正则表达式做你想做的事情可能会很困难,所以在你得到你想要的块作为字符串列表之后进行处理是我要走的路。


推荐阅读