diff --git a/openevolve/utils/code_utils.py b/openevolve/utils/code_utils.py index 6b899193e..f4823fe34 100644 --- a/openevolve/utils/code_utils.py +++ b/openevolve/utils/code_utils.py @@ -5,7 +5,6 @@ import re from typing import Dict, List, Optional, Tuple, Union - _STANDARD_DIFF_PATTERN = r"<<<<<<< SEARCH\n(.*?)=======\n(.*?)>>>>>>> REPLACE" _STANDARD_DIFF_MARKER = re.compile( r"^[ \t]*(<<<<<<< SEARCH|=======|>>>>>>> REPLACE)[ \t]*\r?$", re.MULTILINE @@ -238,7 +237,7 @@ def parse_full_rewrite(llm_response: str, language: str = "python") -> Optional[ Returns: Extracted code or None if not found """ - code_block_pattern = r"```" + re.escape(language) + r"\r?\n(.*?)```" + code_block_pattern = r"```" + re.escape(language) + r"[ \t]*\r?\n(.*?)```" matches = re.findall(code_block_pattern, llm_response, re.DOTALL) if matches: diff --git a/tests/test_code_utils.py b/tests/test_code_utils.py index f0f5b1a26..d0a93a174 100644 --- a/tests/test_code_utils.py +++ b/tests/test_code_utils.py @@ -34,6 +34,18 @@ def test_parse_full_rewrite_literal_language(self): response = "```c\nint wrong;\n```\n```c++\nint correct;\n```" self.assertEqual(parse_full_rewrite(response, "c++"), "int correct;") + def test_parse_full_rewrite_horizontal_whitespace_after_language(self): + for whitespace in (" ", "\t", " \t"): + for newline in ("\n", "\r\n"): + with self.subTest(whitespace=repr(whitespace), newline=repr(newline)): + response = ( + f"```python{whitespace}{newline}" + f"def run():{newline} return 42{newline}```" + ) + namespace = {} + exec(parse_full_rewrite(response), namespace) + self.assertEqual(namespace["run"](), 42) + def test_parse_full_rewrite_fallbacks(self): for response in ("```\nx = 1\n```", "x = 1"): with self.subTest(response=response):