regex 在第Y次出现逗号后添加逗号X个字符

envsm3lx  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(116)

我正在尝试编辑一个文件,其中有多行这种格式。

ATOM,9,HG,LEU,1,162.4,131.44,219.19,0,0,PROA
ATOM,10,CD1,LEU,1,163.3,130.88,219.73,0,0,PROA
ATOM,11,HD11LEU,1,163.54,130.77,219.97,0,0,PROA,
ATOM,12,HD12LEU,1,163.48,130.98,219.76,0,0,PROA,

字符串
对于第2次和第3次出现逗号(e.g. HG, CD1, HD11LEU etc.)之间的每个字符串,我想在最后一次出现的数字后面添加一个逗号,前提是字符串中有一个数字,并且数字后面跟着一个字符(e.g. HD12LEU)。基本上HD12LEU应该转换为HD12,LEU
这就是文件应该看起来的样子。

ATOM,9,HG,LEU,1,162.4,131.44,219.19,0,0,PROA
ATOM,10,CD1,LEU,1,163.3,130.88,219.73,0,0,PROA
ATOM,11,HD11,LEU,1,163.54,130.77,219.97,0,0,PROA,
ATOM,12,HD12,LEU,1,163.48,130.98,219.76,0,0,PROA,


我希望一次对文件中的所有行执行此操作。请推荐一种在R/Python/Linux中实现此功能的方法。

dm7nw8vv

dm7nw8vv1#

下面是Python中的一个可能的解决方案(regex101 demo):

import re

text = """\
ATOM,9,HG,LEU,1,162.4,131.44,219.19,0,0,PROA
ATOM,10,CD1,LEU,1,163.3,130.88,219.73,0,0,PROA
ATOM,11,HD11LEU,1,163.54,130.77,219.97,0,0,PROA,
ATOM,12,HD12LEU,1,163.48,130.98,219.76,0,0,PROA,"""

text = re.sub(
    r"^([^,]+,[^,]+,)([A-Z]+\d+)([A-Z]+)", r"\g<1>\g<2>,\g<3>", text, flags=re.M
)

print(text)

字符串
印刷品:

ATOM,9,HG,LEU,1,162.4,131.44,219.19,0,0,PROA
ATOM,10,CD1,LEU,1,163.3,130.88,219.73,0,0,PROA
ATOM,11,HD11,LEU,1,163.54,130.77,219.97,0,0,PROA,
ATOM,12,HD12,LEU,1,163.48,130.98,219.76,0,0,PROA,

s3fp2yjn

s3fp2yjn2#

带有perl=TRUE的R和带有PyPI正则表达式模块的Python或任何其他使用PCRE或Onigmo正则表达式引擎的语言都支持\K,这会将字符串中的正则表达式指针重置为当前位置,并丢弃匹配返回的所有先前匹配的字符。如果使用其中一个,则可以用逗号替换以下正则表达式的(零宽度)匹配:

^(?:[^,]*,){2}[^\d,]*\d+\K(?=[^\d,])

字符串
其中标志g(“全局”,在第一次匹配后不返回)和m(“多行”,^$分别匹配行的开头和结尾)设置。
Demo
正则表达式可以分解如下。

^         # match the beginning of a line
(?:       # begin a non-capture group
  [^,]*   # match zero or more chars other than a comma
  ,       # match a comma
)         # end non-capture group
{2}       # execute above non-capture group twice
[^\d,]*   # match zero or more chars other than a digit or comma
\d+       # match one or more digits
\K        # reset pointer location and discard all previously-consumed chars
(?=       # begin a positive lookahead
  [^\d,]  # march a character other than a digit or comma
)         # end the positive lookahead


也可以将光标悬停在链接处的表达式的每个部分上以获得其功能的解释。

相关问题