我正在开发一个处理文本文件的脚本,我面临着在字母和符号之间添加空格(排除括号内的单词)的挑战。我已经使用正则表达式实现了一个解决方案,但似乎有一些问题。
我有一个名为 Sample.txt 的文件,该文件中“TEXT:”行中的文本包含要创建的文件夹的名称。
这是当前的代码片段:
import re
def add_space_between_letter_and_symbol(text):
# Add space between letter and symbol, excluding letters followed by a parenthesis
return re.sub(r'(?<=[a-zA-Z(])\s*([^\w\s)(])|(?<=[a-zA-Z])\s+( ?=\b)', r'\1', text)
def process_text(text):
# Add space between letter and symbol, excluding letters in parentheses
text = add_space_between_letter_and_symbol(text)
我想实现以下目标:
1) 创建文件夹名称时,如果符号和字母相邻,请在符号和字母之间添加空格。
2) 避免在括号内的单词内添加空格。
示例
• 文本:(示例)代码“或”[示例]代码
• 文件夹名称:(示例)代码 | [示例] 代码
附加说明:
代码目录中还有另一个进程处理“Text:”行或任何文件名中的无效字符。这些字符将替换为有效字符,具体来说:
# Replace invalid characters from the folder name with a hyphen
replacements = {
"<": "(", ">": ")",
":": ";", "/": "-", "\\": "-", "|": "-", "*": "-", '"': "''"
}
例如,如果输入是:
文本:|示例|代码
应首先应用替换(-示例-代码),然后应在字母和符号之间添加空格(-示例-代码)。
我正在寻求有关如何修改代码以优雅地处理这种情况而不发生冲突的建议。任何帮助或建议将不胜感激。
(脚注:我遇到了此代码的问题,正在寻找改进建议或修复版本。我还想将此应用于可能需要更改名称的其他实例,而不仅仅是 TEXT: 行中的文件夹名称。)
此任务涉及两个主要步骤:替换无效字符,然后在字母和符号之间添加空格,并对括号内的单词进行特殊处理。
您已经定义了一组无效字符的替换。这可以通过单个
re.sub
调用来有效处理,使用函数作为替换参数来根据匹配的字符动态选择替换。
添加空格的正则表达式需要仔细设计:
re.sub
和替换函数的函数。以下是实现此方法的方法:
import re
def replace_invalid_characters(text):
replacements = {
"<": "(", ">": ")", ":": ";", "/": "-", "\\": "-", "|": "-", "*": "-", '"': "''"
}
return re.sub(r'[<>:/\\|*"]', lambda match: replacements[match.group(0)], text)
def add_space_between_letter_and_symbol(text):
return re.sub(r'(?<=\b[a-zA-Z])([^\w\s])(?!\s)|(?<!\s)([^\w\s])(?=\b[a-zA-Z])', r' \1\2', text)
def process_text(text):
text = replace_invalid_characters(text)
text = add_space_between_letter_and_symbol(text)
return text
# Example usage
sample_text = 'TEXT: |Example|Code'
processed_text = process_text(sample_text)
print(processed_text)
replace_invalid_characters
:根据字典替换每个无效字符。add_space_between_letter_and_symbol
:正则表达式的设计目的是:
(?<=\b[a-zA-Z])([^\w\s])(?!\s)
:匹配字母后面的符号,确保不存在空格。(?<!\s)([^\w\s])(?=\b[a-zA-Z])
:匹配字母前面的符号,确保不存在空格。\b
(单词边界)确保我们处理的是独立的单词。process_text
:按顺序应用这两个功能。