regex между первым и последним совпадением \n
Есть строка, нужно вытащить все, что между первым и последним \n (между крайними '\n' могут стоять ЛЮБЫЕ символы, включая такую же подстроку '\n'; '\n' - текст, не перевод строки):
x= r'text text\nФотография\nhttps://blabla.jpg\n\n3 textxtext\n'
pattern = r'\n[^\n]*\n$' # мой вариант вытаскивает предпоследнее-последнее включение
re.findall(pattern, x)
# нужно
> r'Фотография\nhttps://blabla.jpg\n\n3 textxtext'
Ответы (3 шт):
Автор решения: strawdog
→ Ссылка
Если переводов строки в искомом тексте может быть сколько угодно, то я предлагаю вместо того, чтобы городить огород, сделать такой костыль:
x = 'text text\nФотография\nhttps://blabla.jpg\n\n3 textxtext\n'
x1 = 'Карлукрал коралы\nЗапись на стене\n'
pattern = r"\n(.*)"
print(r"\n".join(re.findall(pattern, x.rstrip()))) # Фотография\nhttps://blabla.jpg\n\n3 textxtext
print(r"\n".join(re.findall(pattern, x1.rstrip())))# Запись на стене
Автор решения: Namerek
→ Ссылка
text_1 = r'text text\nФотография\nhttps://blabla.jpg\n\n3 textxtext\n'
print(re.sub(r'^.*?\\n(.+)\\n.*$', r'\1', text_1))
# Фотография\nhttps://blabla.jpg\n\n3 textxtext
Если бы речь шла о \n как о переводе строки, то можно слегка поправить регулярку
print(re.sub(r'^.*?\n(.+)\n.*$', r'\1', text_1, flags=re.S))
Автор решения: dIm0n
→ Ссылка
Вот так вот:
(?<=\\n).*(?=\\n)
Тест https://regex101.com/r/wdTC8g/1/
text text\nФотография\nhttps://blabla.jpg\n\n3 textxtext\n \n42\n \n123\n\n\n\n123\n \n 42
Сгенерированный код:
# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"(?<=\\n).*(?=\\n)"
test_str = ("text text\\nФотография\\nhttps://blabla.jpg\\n\\n3 textxtext\\n\n"
"\\n42\\n\n"
"\\n123\\n\\n\\n\\n123\\n\n"
"\\n\n"
"42\n")
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.