首页 > 解决方案 > 如何匹配第一个字母或数字后的所有制表符?

问题描述

我想使用 REGEX 来匹配出现在第一个字母或数字之后的所有制表符。如下图所示,我有一个分层文本文件,每个级别的类别都标有 TAB ( \t) 字符。

经过一些研究,我发现了几乎符合我愿望的正则表达式:

正则表达式:\b[\t]{1,}\b

问题:

如下图所示,此 REGEX 不会选择出现在以点结尾的字符串(1., 2., 3., 4. ...)之后出现的 TAB。

正则表达式匹配问题

有谁知道如何在 REGEX 中包含这种模式?

这是我的示例的部分文本:

    BBHH    Balanço Patrimonial
            1.      ATIVO                                           Assets
                1.1     CIRCULANTE
                1.2     NÃO CIRCULANTE
            2.      PASSIVO                                         Liabilities and Equity
            3.      RECEITAS
            4.      CUSTOS E DESPESAS
                4.1     CUSTOS DE PRODUTOS VENDIDOS E SERVIÇOS
                        4.1.1       CUSTOS DE PRODUTOS VENDIDOS
                            4.1.1.1         CUSTOS DE PRODUTOS VENDIDOS

标签: regexregex-groupreregexp-replace

解决方案


您可以使用否定的Lookbehinds来确保选项卡不在行首。

尝试以下模式:

(?<!^)(?<!\t)\t+

演示

细节:

  • (?<!^)- 不在行首。
  • (?<!\t)- 前面没有制表符(避免匹配上述制表符之后的制表符)。
  • \t+- 匹配一个或多个制表符(与 相同\t{1,})。

Python 示例:

import re

text = ("\tBBHH\tBalanço Patrimonial\n"
    "\t\t\t1.\t\tATIVO\t\t\t\t\t\t\t\t\t\t\tAssets\n"
    "\t\t\t\t1.1\t\tCIRCULANTE\n"
    "\t\t\t\t1.2\t\tNÃO CIRCULANTE\n"
    "\t\t\t2.\t\tPASSIVO\t\t\t\t\t\t\t\t\t\t\tLiabilities and Equity\n"
    "\t\t\t3.\t\tRECEITAS\n"
    "\t\t\t4.\t\tCUSTOS E DESPESAS\n"
    "\t\t\t\t4.1\t\tCUSTOS DE PRODUTOS VENDIDOS E SERVIÇOS\n"
    "\t\t\t\t\t\t4.1.1\t\tCUSTOS DE PRODUTOS VENDIDOS\n"
    "\t\t\t\t\t\t\t4.1.1.1\t\t\tCUSTOS DE PRODUTOS VENDIDOS\n")

matches = re.finditer(r"(?<!^)(?<!\t)\t+", text, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):
    print ("Match {matchNum} was found at pos:{start}.".
           format(matchNum = matchNum, start = match.start()))

在线尝试


附录:

只要缩进仅使用制表符,上面的模式就可以工作。如果您的文本文件可能混合了用于缩进的制表符和空格字符,则可以改用以下模式:

\S+(\t+)

在这种情况下,您可以从组 1 中提取匹配的选项卡。或者对于替换,您可以使用(\S+)\t+并替换\1为删除选项卡(或用\1x替换选项卡x)。


推荐阅读