如何匹配第一个字母或数字后的所有制表符?
How to match all tab characters after first letter or number?
我想使用 REGEX 来匹配出现在第一个字母或数字之后的所有制表符。如下图所示,我有一个分层文本文件,每个级别的类别都用 TAB (\t
) 字符标记。
经过一些研究,我发现了几乎符合我愿望的正则表达式:
正则表达式:\b[\t]{1,}\b
问题:
如下图所示,此正则表达式不会 select 出现在以点 (1., 2., 3., 4. .. .).
有谁知道如何在 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
您可以使用否定 Lookbehinds 来确保制表符不在行的开头。
尝试以下模式:
(?<!^)(?<!\t)\t+
Demo.
详情:
(?<!^)
- 不在行首。
(?<!\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()))
附录:
只要缩进只使用制表符,上面的模式就可以工作。如果您的文本文件可能混合使用制表符和 space 字符用于缩进,您可以改用以下模式:
\S+(\t+)
在这种情况下,您可以从第 1 组中提取匹配的标签。或者为了替换,您可以使用 (\S+)\t+
并替换为 </code> 以删除标签(或使用 <code>x
将制表符替换为 x
).
我想使用 REGEX 来匹配出现在第一个字母或数字之后的所有制表符。如下图所示,我有一个分层文本文件,每个级别的类别都用 TAB (\t
) 字符标记。
经过一些研究,我发现了几乎符合我愿望的正则表达式:
正则表达式:\b[\t]{1,}\b
问题:
如下图所示,此正则表达式不会 select 出现在以点 (1., 2., 3., 4. .. .).
有谁知道如何在 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
您可以使用否定 Lookbehinds 来确保制表符不在行的开头。
尝试以下模式:
(?<!^)(?<!\t)\t+
Demo.
详情:
(?<!^)
- 不在行首。(?<!\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()))
附录:
只要缩进只使用制表符,上面的模式就可以工作。如果您的文本文件可能混合使用制表符和 space 字符用于缩进,您可以改用以下模式:
\S+(\t+)
在这种情况下,您可以从第 1 组中提取匹配的标签。或者为了替换,您可以使用 (\S+)\t+
并替换为 </code> 以删除标签(或使用 <code>x
将制表符替换为 x
).