import re def process_text(input_string, collapse_sequential_spaces=False, strip_leading_spaces=False, strip_trailing_spaces=False, strip_leading_symbols=False, strip_trailing_symbols=False, strip_newlines=False, replace_newlines_with_period_space=False, strip_empty_lines=False, strip_inside_tags=None, strip_between_start=None, strip_between_end=None, strip_leading_custom=None, strip_trailing_custom=None, strip_all_custom=None, find_list=None, replace_list=None, remove_text_before=None, remove_text_after=None): """ Cleans up the input string based on the provided options. Args: input_string (str): The text to be processed. collapse_sequential_spaces (bool): If True, collapse multiple spaces into one. strip_leading_spaces (bool): If True, strip leading spaces per line. strip_trailing_spaces (bool): If True, strip trailing spaces per line. strip_leading_symbols (bool): If True, strip leading punctuation symbols per line. strip_trailing_symbols (bool): If True, strip trailing punctuation symbols per line. strip_newlines (bool): If True, remove all newlines. replace_newlines_with_period_space (bool): If True, replace multiple newlines with '. '. strip_empty_lines (bool): If True, remove empty or whitespace-only lines. strip_inside_tags (list of str): List of character pairs to strip content between. strip_between_start (list of str): List of start tags to strip content from. strip_between_end (list of str): List of end tags to strip content to. strip_leading_custom (list of str): List of custom strings to strip from the start of each line. strip_trailing_custom (list of str): List of custom strings to strip from the end of each line. strip_all_custom (list of str): List of custom strings to remove throughout the text. find_list (list of str): List of strings to find. replace_list (list of str): List of strings to replace with. remove_text_before (list of str): Remove all text before these markers. remove_text_after (list of str): Remove all text after these markers. Returns: str: The processed text. """ # Collapse sequential spaces (First Pass) if collapse_sequential_spaces: # Replace multiple spaces (2 or more) with a single space input_string = re.sub(r' {2,}', ' ', input_string) # Replace or strip newlines if replace_newlines_with_period_space: # Replace one or more consecutive newlines with '. ' input_string = re.sub(r'\n+', '. ', input_string) elif strip_newlines: input_string = input_string.replace('\n', '') # Remove text before markers if remove_text_before: for marker in remove_text_before: if not marker: continue if marker in input_string: # Keep everything AFTER the marker input_string = input_string.partition(marker)[2] # Remove text after markers if remove_text_after: for marker in remove_text_after: if not marker: continue if marker in input_string: # Keep everything BEFORE the marker input_string = input_string.partition(marker)[0] # Strip inside tags if strip_inside_tags: for tag_pair in strip_inside_tags: if len(tag_pair) != 2: raise ValueError(f"Each line in 'strip_inside_tags' must have exactly two characters. Found '{tag_pair}'") start_char, end_char = tag_pair[0], tag_pair[1] pattern = re.escape(start_char) + '.*?' + re.escape(end_char) input_string = re.sub(pattern, '', input_string, flags=re.DOTALL) # Strip between start/end tags if strip_between_start and strip_between_end: for start_tag, end_tag in zip(strip_between_start, strip_between_end): if not start_tag or not end_tag: # Skip empty tags continue pattern = re.escape(start_tag) + '.*?' + re.escape(end_tag) input_string = re.sub(pattern, '', input_string, flags=re.DOTALL) # Split input into lines for per-line processing lines = input_string.split('\n') # Strip leading spaces per line if strip_leading_spaces: lines = [line.lstrip() for line in lines] # Strip trailing spaces per line if strip_trailing_spaces: lines = [line.rstrip() for line in lines] # Remove empty lines if strip_empty_lines: lines = [line for line in lines if line.strip()] # Strip leading symbols per line if strip_leading_symbols: pattern = r'^[,\.!\?:;]+' lines = [re.sub(pattern, '', line) for line in lines] # Strip trailing symbols per line if strip_trailing_symbols: pattern = r'[,\.!\?:;]+$' lines = [re.sub(pattern, '', line) for line in lines] # Strip leading custom strings per line if strip_leading_custom: new_lines = [] for line in lines: original_line = line for custom_str in strip_leading_custom: if not custom_str: # Skip empty strings continue custom_len = len(custom_str) while line.startswith(custom_str) and len(line) >= custom_len: line = line[custom_len:] new_lines.append(line) lines = new_lines # Strip trailing custom strings per line if strip_trailing_custom: new_lines = [] for line in lines: for custom_str in strip_trailing_custom: if not custom_str: # Skip empty strings continue custom_len = len(custom_str) while line.endswith(custom_str) and len(line) >= custom_len: line = line[:-custom_len] new_lines.append(line) lines = new_lines # Rejoin lines after per-line processing input_string = '\n'.join(lines) # Strip custom strings throughout the text if strip_all_custom: for custom_str in strip_all_custom: if not custom_str: # Skip empty strings continue input_string = input_string.replace(custom_str, '') # Find and replace if find_list and replace_list: if find_list and any(find_list): for find_str, replace_str in zip(find_list, replace_list): if not find_str: # Skip empty find strings continue input_string = input_string.replace(find_str, replace_str) else: # If find_list is empty or None, do nothing pass # Collapse sequential spaces (Second Pass) if collapse_sequential_spaces: # Replace multiple spaces (2 or more) with a single space input_string = re.sub(r' {2,}', ' ', input_string) return input_string