Предположим, что у меня есть следующая строка:

mystr = """
<p>Some text and another text. </p> ![image_file_1][image_desc_1] some other text. 
<p>some text</p> 
![image_file_2][image_desc_2] and image: ![image_file_3][image_desc_3] 
test case 1: ![dont_match_1]
test case 2: [dont_match_2][dont_match_3]
finally: ![image_file_4][image_desc_4]
"""

Я могу получить image_file_X, используя следующий код:

import re
re.findall('(?<=!\[)[^]]+(?=\]\[.*?\])', mystr)

Я хочу захватить image_desc_X, но следующее не работает:

re.findall('(?!\[.*?\]\[)[^]]+(?=\])', mystr)

Какие-либо предложения? Если бы я мог получить и image_file, и image_desc, используя одну команду, это было бы еще лучше.

1
HBat 25 Апр 2017 в 00:37

2 ответа

Лучший ответ

Используйте следующий подход:

result = re.findall(r'!\[([^]]+)\]\[([^]]+)\]', mystr)
print(result)

Выход:

[('image_file_1', 'image_desc_1'), ('image_file_2', 'image_desc_2'), ('image_file_3', 'image_desc_3'), ('image_file_4', 'image_desc_4')]
2
RomanPerekhrest 25 Апр 2017 в 04:18

Я думаю, вы можете использовать:

for match in re.finditer(r"!\[(.*?)\]\[(.*?)]", mystr):
    print match.group(1)
    print match.group(2)

Выход:

image_file_1
image_desc_1
image_file_2
image_desc_2
image_file_3
image_desc_3
image_file_4
image_desc_4

DEMO

1
Pedro Lobito 24 Апр 2017 в 21:54