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

Python 仅在两个字符串模式之间复制字符串,python,regex,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”对象没有属性“replace”因此,例如:

测试一些正则表达式代码。我想应该是这样的

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”对象没有属性“replace”

因此,例如:

results = re.findall(r'table_name:\s+([a-z _0-9]+)\n(.*?)\sid: validate',lines,flags=re.DOTALL)
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 = 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...']
这将生成元组,您(我假设)正在尝试执行类似于
结果[0]的操作。replace()
,但由于出现错误而失败

更改正则表达式给了我:

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 = 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行及以上的任何内容。使用纯正则表达式可能很难实现所需的功能,因此,在获得所需的块作为字符串列表后进行处理是我的选择。

因此,例如:

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 = 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...']
这将生成元组,您(我假设)正在尝试执行类似于
结果[0]的操作。replace()
,但由于出现错误而失败

更改正则表达式给了我:

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 = 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行及以上的任何内容。使用纯正则表达式可能很难实现所需的操作,因此,在获得所需的块作为字符串列表后进行处理是我的选择。

什么是
,您确定错误来自此代码吗?您没有在此处调用
.replace()
,这可能是用来查找以后要替换的内容的代码…您似乎需要执行类似
结果[p][1]。replace()
结果[p][0]。replace()
什么是
,并且您确定错误来自此代码吗?您没有在此处调用
.replace()
,而且这可能是用来查找以后要替换的内容的代码…似乎您需要执行类似
结果[p][1]。replace()
结果[p][0]。replace()
是,是,是!!就这样。这让我昨天几个小时都快发疯了。我正朝着正确的方向前进,但一路上被卡住了。我很接近,但接近并不重要。这正是我想要的。非常感谢!!还有一个简短的问题。一旦我找到带有“table_name:”的行,我可以复制这一行,然后跳过8行,然后通过“id:validate”复制第9行吗?用正则表达式可以吗?一旦我找到“table_name:”(称这一行为1),第2-8行就真的没用了,而且都不一样,所以我无法进行替换(“任何东西”)。在这些起点和终点之间有太多的东西。对不起,我不知道你想做什么。您希望找到第一个<代码> Table名称>代码>最后的代码> ID:验证< /代码>,然后删除中间的所有内容(包括其他<代码> Table SynEng/<代码>和<代码> ID:验证< /代码>字符串)?不,我想找到第一个表名,得到它,跳过8行,然后从那里复制所有的ID:验证。这是可能的吗?你能用你拥有的数据和你想用它做什么的具体例子来编辑你的问题吗?是的,是的,是的!!就这样。这让我昨天几个小时都快发疯了。我正朝着正确的方向前进,但一路上被卡住了。我很接近,但接近并不重要。这正是我想要的。非常感谢!!还有一个简短的问题。一旦我找到带有“table_name:”的行,我可以复制这一行,然后跳过8行,然后通过“id:validate”复制第9行吗?用正则表达式可以吗?一旦我找到“table_name:”(称这一行为1),第2-8行就真的没用了,而且都不一样,所以我无法进行替换(“任何东西”)。在这些起点和终点之间有太多的东西。对不起,我不知道你想做什么。您希望找到第一个<代码> Table名称>代码>最后的代码> ID:验证< /代码>,然后删除中间的所有内容(包括其他<代码> Table SynEng/<代码>和<代码> ID:验证< /代码>字符串)?不,我想找到第一个表名,得到它,跳过8行,然后从那里复制所有的ID:验证。这可能吗?你能用一个具体的例子来编辑你的问题吗?你有哪些数据以及你想用这些数据做什么?