优化代码以在字母和符号之间添加空格,不包括带括号的单词

Optimizing Code for Adding Spaces between Letters and Symbols, Excluding Parenthesized Words

提问人:Marco 提问时间:11/10/2023 更新时间:11/10/2023 访问量:23

问:

我正在开发一个处理文本文件的脚本,我面临着在字母和符号之间添加空格的挑战,不包括括号内的单词。我已经使用正则表达式实现了一个解决方案,但它似乎存在一些问题。

我有一个名为 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:(示例)代码“或”[示例]代码

• 文件夹名称:(示例)代码 |[示例]法典

附加说明:

代码目录中还有另一个进程,用于处理“Text:”行或任何文件名中的无效字符。这些字符将替换为有效字符,具体而言:

# Replace invalid characters from the folder name with a hyphen
replacements = {
    "<": "(", ">": ")",
    ":": ";", "/": "-", "\\": "-", "|": "-", "*": "-", '"': "''"
}

例如,如果输入为:

文本: |示例|法典

应首先应用替换 (-Example-Code),然后进行在字母和符号之间添加空格 (-Example - Code) 的过程。

我正在寻求有关如何修改代码以优雅地处理这种情况而不会发生冲突的建议。任何帮助或建议将不胜感激。

(脚注:我遇到了此代码的问题,正在寻找改进建议或修复版本。我还想将其应用于可能需要更改名称的其他实例,而不仅仅是 TEXT: 行中的文件夹名称。

重命名 python-re 文件重命名

评论


答:

0赞 Iman Mohammadi 11/24/2023 #1

此任务涉及两个主要步骤:替换无效字符,然后在字母和符号之间添加空格,并对括号内的单词进行特殊处理。

替换无效字符

您已经为无效字符定义了一组替换项。这可以通过单个调用有效地处理,使用函数作为替换参数,根据匹配的字符动态选择替换。re.sub

添加空间

添加空格的正则表达式需要仔细设计,以便:

  1. 在字母和符号之间或符号和字母之间添加一个空格。
  2. 避免在括号内添加空格。

建议的解决方案

  1. 替换无效字符:创建一个与替换函数一起使用的函数。re.sub
  2. 添加空格:修改正则表达式以正确处理间距逻辑。

以下是实现此目的的方法:

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:按顺序应用这两个函数。

评论

0赞 Marco 11/24/2023
它没有用。示例和“结果:.从结果中可以看出,空间在标志内部,而不是在单词“代码”和标志之间。除此之外,该符号被替换为两个符号(),从而旨在实现相同的外观。出于某种原因,代码目录在单词“life”开头的两个符号之间添加了一个空格。TEXT: [Example]Code "life" | Go to Nature[Example ]Code ' 'life'' - Go to Nature]]"'''