python 正则表达式-如何捕获字符串中指定的多个字符

jjhzyzn0  于 2023-04-28  发布在  Python
关注(0)|答案(2)|浏览(91)

我尝试使用正则表达式从字符串中提取一个数字以及与该数字相等的字符数。这用于分析samtools mpileup的堆积摘要输出(请参见here)。我正在做的是Python。
例如,假设我有以下字符串:
.....+3AAAT.....
我试图从字符串中提取+3AAA,留给我们:
.....T.....
请注意,T仍然存在,因为我只想提取3个字符(因为字符串指示应该提取3个字符)。
我可以这样做:
re.sub("\+[0-9]+[ACGTNacgtn]+", "", ".....+3AAAT.....")
但这也会删除T,留给我们:
..........
有没有一种方法可以使用字符串中的信息来调整正则表达式中的模式?有很多方法可以使用正则表达式来实现这一点,但是如果有一种方法可以使用正则表达式来实现,我宁愿使用这种方法。

lrpiutwd

lrpiutwd1#

你可以传递一个lambdare.sub()

import re

def replace(string):
  replaced = re.sub(
    r'\+([0-9]+)([ACGTNacgtn]+)',
    # group(1) = '3', group(2) = 'AAAT'
    lambda match: match.group(2)[int(match.group(1)):],
    string
  )
  return replaced

试试看:

string = '.....+3AAAT.....'
print(replace(string))  # '.....T.....'

string = '.....+10AAACCCGGGGTN.....'
print(replace(string))  # '.....TN.....'

string = '.....+0AN.....'
print(replace(string))  # '.....AN.....'

string = '.....+5CAGN.....'
print(replace(string))  # '..........'
2skhul33

2skhul332#

有一个(不明智的)纯粹基于regex的解决方案,分别匹配每个可能的数字:

import re

MAX_NUMBER = 10

regex = re.compile(
    r"\+(?:" + "|".join(f"{d}[acgtn]{{{d}}}" for d in range(MAX_NUMBER)) + ")",
    flags=re.IGNORECASE,
)
regex.sub("", ".....+3AAAT.....")

这使得regex代表下面的怪物。

\+(?:0[acgtn]{0}|1[acgtn]{1}|2[acgtn]{2}|3[acgtn]{3}|4[acgtn]{4}|5[acgtn]{5}|6[acgtn]{6}|7[acgtn]{7}|8[acgtn]{8}|9[acgtn]{9})

{0}{1}有点傻,但可能不值得花力气去修复它们。)

相关问题