Тестирование некоторого кода регулярного выражения. Думаю, это должно выглядеть примерно так.

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
ASH 23 Окт 2018 в 17:15

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 и выше. Вероятно, было бы сложно делать то, что вы хотите, с помощью чистого регулярного выражения, поэтому я бы хотел, чтобы обработка после получения нужных вам кусочков в виде списков строк.

2
CJR 9 Фев 2019 в 22:41
results = re.findall(r'table_name:\s+([a-z _0-9]+)\n(.*?)\sid: validate',lines,flags=re.DOTALL)
1
ryguy72 5 Фев 2019 в 22:48
52951301