【问题标题】:Regular Expression in Python to add Space in matching LinePython中的正则表达式在匹配行中添加空格
【发布时间】:2019-11-13 23:07:59
【问题描述】:

我有一个文本文件,其中一些行包含如下数据。 我想通过在开头添加更多空间来替换与这些模式匹配的行(即,目前这些行有 14 个空间,我想将其设为 34)。

我不能只将 14 个空格替换为 34 个,因为还有其他行也有 14 个空格但不匹配下面的模式。

          9
          1P
          PKC
          ABC1
          1BC1C
          ZBC12X
          A4C12XZ
          H4C12XZQ
          94C12XZQQ
          Q4C12XZQQT
          A4C12XZQQTY

我正在使用所有 11 个单独的代码来搜索这 11 个模式,如下所示:

[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z]$
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z][0-9,A-Z]$
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z][0-9,A-Z][0-9,A-Z]$
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]$
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]$
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]$
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]$
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]$
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]$

以下是我正在使用的 Python 代码。

import re

input_file = open("1.txt", "r")

for line in input_file:
    if re.match('[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]$', line):
        print (line)

我现在需要有关如何替换文本以获得低于输出的指导。我可以使用 re.Sub,但是我如何才能添加空格而不替换原始行中的其他字符,该字符应该仅用于匹配模式。

输出:

                              9
                              1P
                              PKC
                              ABC1
                              1BC1C
                              ZBC12X
                              A4C12XZ
                              H4C12XZQ
                              94C12XZQQ
                              Q4C12XZQQT
                              A4C12XZQQTY

【问题讨论】:

  • @toolic 当我们使用它时,我们可以放弃方括号`{14}`。 @Rahul 看起来您是正则表达式的新手,对一些常见的特殊字符代表什么感到困惑。我建议您访问 regex101.com 并进行试验,或查看此问题的答案以获得一般的正则表达式参考:stackoverflow.com/questions/22937618/…
  • 您可以在 2 组中匹配 14 个空格和 1-11 倍的字符类 [A-Z0-9] 并替换为 2 组 \1extraspaceshere\2^( {14})([0-9A-Z]{1,11})regex101.com/r/DG3FNF/1
  • @第四只鸟:谢谢,这听起来很有帮助。我正在浏览此链接并尝试合并更改。如果有任何问题或有效,将发布。
  • @CAustin:感谢您分享链接,我确实是新手,但会尝试通过此链接并根据我的要求进行更改。

标签: python regex text


【解决方案1】:

我建议使用以下正则表达式:https://regex101.com/r/6crgHK/1

那么,您的替换模式将是:

import re

input_file = open("1.txt", "r")

pattern = re.compile(r'\s+([\dA-Z]+)$')

for line in input_file:
    if re.match(pattern, line):
        line = re.sub(pattern, r'34spaces\1', line)
        print(line)

当然,34spaces 部分需要替换为实际的 34 个空格。 :)

【讨论】:

  • @Jayg_Code:谢谢你的回答,我正在检查这个。将在几分钟内发布更新。
  • @CAustin: 当然也会尝试使用乘数
  • @Rahul,我想补充一点,因为你只是在空格后面的字符之后,所以你只是在第一个捕获组之后(即括号之间的内容) .我已经编辑了我的答案以反映这一点。
  • 谢谢,我看到了更新,代码正在搜索和匹配字符串,但仍然无法添加空格。如果我打印行 print (line) re.sub(pattern, r'34ActualSpacesEntered\1', line) print (line),我也会得到与文件中的输入相同的输出
  • 我再次编辑了我的答案,因此您将line 变量的值替换为re.sub 的输出。
【解决方案2】:
> import re
> 
> input_file = open("1.txt", "r") space = ' ' * 14 for line in input file:
>     if re.match('[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]$',line):
>         print (space + line)

这可能有效!我只是在与您的查询匹配的任何行前添加 14 个空格,然后将空格和您的行连接起来以打印 14 个空格,然后是您的行。

【讨论】:

  • 嘿 Abhishek,感谢您的回答,但我需要实际存储字符串,而不是最好在其他新文本文件中打印。
猜你喜欢
  • 2020-09-22
  • 2010-10-08
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多