使用记事本,我可以在使用回溯时在正则表达式查找和替换期间删除空格吗?

Posted

技术标签:

【中文标题】使用记事本,我可以在使用回溯时在正则表达式查找和替换期间删除空格吗?【英文标题】:Using Notepad, can I remove spaces during a regex find and replace while using backtracking? 【发布时间】:2016-11-27 16:14:53 【问题描述】:

我使用的是 Notepad++(6.9.2 版)

我有一个固定宽度的平面文件数据库,需要重新排列和清理。

文件示例:

0001168500Mel     Maenyey Legal College                                                                       91PO Box 867                                                                                          Lutghjhe                                          403003Jellisa Moneyey                                             07 3660 2551        07 3660 2211        Jellisa@gglegalcollege.com.nz                                                   

这是我当前的“查找”正则表达式:

^(.10)(.100)(.2)(.50)(.50)(.50)(.4)(.2)(.60)(.20)(.20)(.80)

这是我的“替换”正则表达式:

"$1","$2","$3","$4","$5","$6","$7","$8","$9","$10","$11","$12"

这些效果很好,但我想:

    不复制填充空间(右侧或左侧) 从数值中删除左边的“0”(零) - 此示例文件中没有,但其他文件中有一些。

我已经搜索并找不到在同一个正则表达式中可能出现这种情况的示例。之后我可以做另一个正则表达式,但如果有一些快速和容易添加到这个的东西会很好;-)

【问题讨论】:

分多个步骤进行会更容易。应用您拥有的正则表达式并且所有内容都用逗号整齐分隔后,您只需将 "[ 0]+| +" 替换为 " 我认为您可以轻松地将这些后处理添加到 Python 脚本中。如果你有兴趣,我会在有空的时候“煮”一个。 【参考方案1】:

您当前的正则表达式会产生以下输出:

"0001168500","Mel     Maenyey Legal College                                                                       ","91","PO Box 867                                        ","                                                  ","Lutghjhe                                          ","4030","03","Jellisa Moneyey                                             ","07 3660 2551        ","07 3660 2211        ","Jellisa@gglegalcollege.com.nz                                                   "

正则表达式方法的问题在于您有固定宽度的字段,并且可能的前导零和前导/尾随空格的数量是可变的。虽然在某些情况下它可以通过所有格匹配和后视来帮助,但我建议使用更灵活、基于代码的方法。

Install the working PythonScript version,并创建一个脚本文件,内容如下:

import re
def repl(match): 
    return '"0","1","2","3","4","5","6","7","8","9","10","11"'.format(
        digit_reg.sub(r'\1', match.group(1).strip()),
        digit_reg.sub(r'\1', match.group(2).strip()),
        digit_reg.sub(r'\1', match.group(3).strip()),
        digit_reg.sub(r'\1', match.group(4).strip()),
        digit_reg.sub(r'\1', match.group(5).strip()),
        digit_reg.sub(r'\1', match.group(6).strip()),
        digit_reg.sub(r'\1', match.group(7).strip()),
        digit_reg.sub(r'\1', match.group(8).strip()),
        digit_reg.sub(r'\1', match.group(9).strip()),
        digit_reg.sub(r'\1', match.group(10).strip()),
        digit_reg.sub(r'\1', match.group(11).strip()),
        digit_reg.sub(r'\1', match.group(12).strip())
    )

pat = r'^(.10)(.100)(.2)(.50)(.50)(.50)(.4)(.2)(.60)(.20)(.20)(.80)'
digit_reg = re.compile(r'^0+([0-9]*)$')
editor.rereplace(pat, repl)

您拥有的模式将用于匹配单独的字段。匹配数据对象将传递给repl 方法,其中每个字段将使用.strip() 方法从前导/尾随空格中修剪,^0+([0-9]*)$ 正则表达式将应用于所有字段以删除前导仅由数字组成的字符串中的零。

【讨论】:

以上是关于使用记事本,我可以在使用回溯时在正则表达式查找和替换期间删除空格吗?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式不会在新行上回溯

在记事本++中用正则表达式查找和替换可变数字

R语言之正则表达式

干货收藏 | R语言之正则表达式

C# 正则表达式(Regex) 过滤内容的基本使用

C# 正则表达式(Regex) 过滤内容的基本使用