Python清理文件的多个正则表达式 前言

Python清理文件的多个正则表达式 前言,python,regex,removing-whitespace,Python,Regex,Removing Whitespace,我已经有一段时间没有使用python了,所以我在数据清理方面遇到了问题。 在notepad++中,速度非常慢,因此我正在寻找python中更高效的选项 我需要什么 我需要清理一个目录中的100多个文件,所有文件都是从SAP手动提取的 我正在寻找的步骤: 用------ 用------ 从每行中删除第一个和最后一个字符| 在需要的地方删除空白-我需要保留文本之间的空白 原始文件 预期结果 这段代码正是我试图使用的,但我需要正则表达式组合方面的帮助。在记事本++中,我可以使用\h+(\w+)\h+

我已经有一段时间没有使用python了,所以我在数据清理方面遇到了问题。 在notepad++中,速度非常慢,因此我正在寻找python中更高效的选项

我需要什么 我需要清理一个目录中的100多个文件,所有文件都是从SAP手动提取的

我正在寻找的步骤:

  • ------
  • ------
  • 从每行中删除第一个和最后一个字符
    |
  • 在需要的地方删除空白-我需要保留文本之间的空白
  • 原始文件 预期结果
    这段代码正是我试图使用的,但我需要正则表达式组合方面的帮助。在记事本++中,我可以使用
    \h+(\w+)\h+
    作为替换
    \1
    ,但在这里它不起作用。请帮助我构建一个合适的正则表达式。

    两种方法:

    --使用内置的
    str
    对象函数:

    with open('yourfile.txt', 'r') as f:
        lines = f.read().splitlines()     # getting list of lines
        for l in lines:
            if not l.startswith('---'):   # skip dashed lines
                print('|'.join(map(str.strip, l.strip('|').split('|'))))
    

    --使用
    re.sub()
    函数:

    with open('yourfile.txt', 'r') as f:
        lines = f.read().splitlines()
        for l in lines:
            if not l.startswith('---'):
                print(re.sub(r'\|\s*|\s*\|', '|', l).strip('|'))
                # an auxiliary pattern for complex cases:
                # re.sub(r'\|\s*(\S*)\s*(?=\|)', '|\\1', l).strip('|')
    

    输出:

    MANDT|BUKRS|NETWR|UMSKS|UMSKZ|AUGDT|AUGBL|ZUONR
    100|1000|23.321-|||||TEXT I WANT TO KEEP
    100|1000|0.12|||||TEXT I WANT TO KEEP
    100|1500|90|||||TEXT I WANT TO KEEP
    

    读/写模式:

    要使用新内容覆盖当前文件,请使用以下方法:

    with open('yourfile.txt', 'r+') as f:   # 'r+' - read/write mode
        lines = f.read().splitlines()
        f.seek(0)      # reset file pointer
        f.truncate()   # truncating file contents
        for l in lines:
            if not l.startswith('---'):
                # or f.write('|'.join(map(str.strip, l.strip('|').split('|'))) + '\n')
                f.write(re.sub(r'\|\s*|\s*\|', '|', l).strip('|') + '\n')
    

    对于参考中的代码段,可以使用以下模式:

    REGEXES = [(re.compile(r'^[-\n]+',re.M), ''),
           (re.compile(r'([\s]+)?\|([\s]+)?'), '|')]
    
    前言 假设所有文件的格式都相同,只需使用regex替换即可

    答复 您可以在regex101上查看正在使用的

    解释 这个正则表达式将:

  • 捕获所有制表符或空格字符
  • 捕获所有
    -
    字符,其中两个这样的字符紧跟在一起(以及后面的任何空白字符)
  • 捕获以
    |
    字符开头的所有行
  • 捕获以
    |
    字符结尾的所有行
  • 注意,必须确保全局
    g
    和多行
    m
    修改器处于活动状态。


    代码 最终代码应类似于以下内容:

    import re
    
    regex = r"[\t ]|-{2,}\s*|^\||\|$"
    
    subst = ""
    
    result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
    
    if result:
        print (result)
    
    import re
    
    regex = r"(?:^\|[\t ]*)|(?:[\t ]*\|$)|(?:(?<=\|)[\t ]*)|(?:[\t ]*(?=\|))|(?:-{2,}\s*)"
    
    subst = ""
    
    result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
    
    if result:
        print (result)
    
    其中
    test\u str
    包含文件的内容(如下所示)

    输出
    编辑 答复 您可以在regex101上查看正在使用的

    解释 其中
    test\u str
    包含文件的内容(如下所示)

    输出
    忽略没有
    |
    的行,在
    |
    上拆分,修剪,用
    |
    连接值。这个算法不需要正则表达式。正如我提到的,我已经有一段时间没有使用python了——我想大概有一年了。你能分享一些代码吗?它给出了“gm部分”的语法错误-这是什么意思?我想用
    ^
    来指示需要设置多行标志的行的开始。我已经用正确的语法更新了我的答案。非常感谢,但如何调整它,使它不会删除文本之间的空格?我有一些文本属性,以及我需要保持空间。聪明!很好的开箱思考,而不是仅仅按照正则表达式的路径进行我如何覆盖我正在使用的文件?我不想打印它。我尝试使用l=“|”).join(map(str.strip,l.strip(“|”).split(“|”))但它不起作用。@user2433705,请参阅我的上一篇文章approach@RomanPerekhrest,有一件事我仍然需要更新-如何修改正则表达式以删除在数字之前弹出的空白-我没有将其包括在原始示例中。因此,在我的例子中,我有
    |100 | 1000 | 23.321-| | | | |
    @user2433705,请参阅注释
    #复杂情况的辅助模式下的更新:
    import re
    
    regex = r"[\t ]|-{2,}\s*|^\||\|$"
    
    subst = ""
    
    result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
    
    if result:
        print (result)
    
    ---------------------------------------------------------------------------
    |  MANDT|BUKRS|NETWR     |UMSKS|UMSKZ|AUGDT     |AUGBL|ZUONR              |
    ---------------------------------------------------------------------------
    |  100  |1000 |23.321-   |     |     |          |     |TEXT I WANT TO KEEP|
    |  100  |1000 |0.12      |     |     |          |     |TEXT I WANT TO KEEP|
    |  100  |1500 |90        |     |     |          |     |TEXT I WANT TO KEEP|
    ---------------------------------------------------------------------------
    
    MANDT|BUKRS|NETWR|UMSKS|UMSKZ|AUGDT|AUGBL|ZUONR
    100|1000|23.321-|||||TEXTIWANTTOKEEP
    100|1000|0.12|||||TEXTIWANTTOKEEP
    100|1500|90|||||TEXTIWANTTOKEEP
    
    (?:^\|[\t ]*)|(?:[\t ]*\|$)|(?:(?<=\|)[\t ]*)|(?:[\t ]*(?=\|))|(?:-{2,}\s*)
    
    import re
    
    regex = r"(?:^\|[\t ]*)|(?:[\t ]*\|$)|(?:(?<=\|)[\t ]*)|(?:[\t ]*(?=\|))|(?:-{2,}\s*)"
    
    subst = ""
    
    result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
    
    if result:
        print (result)
    
    ---------------------------------------------------------------------------
    |  MANDT|BUKRS|NETWR     |UMSKS|UMSKZ|AUGDT     |AUGBL|ZUONR              |
    ---------------------------------------------------------------------------
    |  100  |1000 |23.321-   |     |     |          |     |TEXT I WANT TO KEEP|
    |  100  |1000 |0.12      |     |     |          |     |TEXT I WANT TO KEEP|
    |  100  |1500 |90        |     |     |          |     |TEXT I WANT TO KEEP|
    ---------------------------------------------------------------------------
    
    MANDT|BUKRS|NETWR|UMSKS|UMSKZ|AUGDT|AUGBL|ZUONR
    100|1000|23.321-|||||TEXT I WANT TO KEEP
    100|1000|0.12|||||TEXT I WANT TO KEEP
    100|1500|90|||||TEXT I WANT TO KEEP