我可以使用以下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