如何删除特定长度的子字符串周围的括号



我可以使用以下Python函数从字符串中完全移除方括号:

def bracket_remove(smi):
remove_chars = ['[', ']']
return ''.join((filter(lambda i: i not in remove_chars, smi)))

然而,在某些情况下,我希望保留括号内的部分。具体来说,我只想在方括号包含单个字符的情况下删除方括号。例如,[N][C@H]([C])[C](=O)[O]将变为N[C@H](C)C(=O)O。正则表达式似乎是解决这个问题的方法,但我还没有找到与这个问题相关的内容。我能找到的最接近正则表达式的解决方案是:

import re
test_str = "[N][C@H]([C])[C](=O)[O]"
m = re.search(r"[(w+)]", test_str)
print(m.group(1))

这只返回括号内字符(N(的第一个实例,而我曾认为它可以识别括号之间存在多个字符的情况。如何修改此表达式以仅查找括号之间有多个字符(字母数字或其他字符(的子字符串?

您可以使用

re.sub(r'[(w)]', r'1', text)
# Or any char other than brackets
re.sub(r'[([^][])]', r'1', text)

请参阅regex#demo和regex#2 demo。

详细信息

  • [-匹配[字符
  • (w)-将任何字母/数字/连接器标点符号捕获到组1中
  • ([^][])-捕获除[]之外的任何字符
  • ]-匹配一个]字符

替换模式中的1用组1值的内容替换每个匹配。

请参阅Python演示:

import re
text = '[N][C@H]([C])[C](=O)[O]'
print(re.sub(r'[(w)]', r'1', text))
# => N[C@H](C)C(=O)O
# Or any char other than brackets
print(re.sub(r'[([^][])]', r'1', text))
# => N[C@H](C)C(=O)O

最新更新