Вы можете сопоставить дату как образец. Затем используйте закаленный жадный жетон подход (?:(?!\d{2}\/\d{2}\/\d{2}).)*
, чтобы сопоставить string
, не сопоставляя сначала другую дату.
Если вы сопоставили string
, используйте не жадную точку .*?
чтобы соответствовать первому вхождению следующей даты.
\d{2}\/\d{2}\/\d{2}(?:(?!\d{2}\/\d{2}\/\d{2}).)*string.*?\d{2}\/\d{2}\/\d{2}
Regex demo | Python demo
Например (используя re.DOTALL
, чтобы точка соответствовала новой строке)
import re
regex = r"\d{2}\/\d{2}\/\d{2}(?:(?!\d{2}\/\d{2}\/\d{2}).)*string(?:(?!string|\d{2}\/\d{2}\/\d{2}).)*\d{2}\/\d{2}\/\d{2}"
test_str = """01/20/20\n\n"
"string\n\n"
"01/21/20\n\n"
"01/20/20\n\n"
"this isn't the phrase you're looking for\n\n"
"01/21/20\n\n"
"string"""
print(re.findall(regex, test_str, re.DOTALL))
Вывод
['01/20/20\n\n"\n\t"string\n\n"\n\t"01/21/20']
Если string
не может произойти 2 раза между датами, вы можете использовать
\d{2}\/\d{2}\/\d{2}(?:(?!\d{2}\/\d{2}\/\d{2}|string).)*string(?:(?!string|\d{2}\/\d{2}\/\d{2}).)*\d{2}\/\d{2}\/\d{2}
Regex demo
Обратите внимание, что если вы этого не сделаете чтобы строка и даты были частью большего слова, можно добавить границы слов \b