python正则表达式索引长字符串并消除常规模式A和B之间的所有事物

时间:2017-03-30 15:25:26

标签: python regex

我有以下句子,我希望摆脱格式为'(数字)/(...;数字)'的所有内容:

  

在所有生物体中,从细菌到人类,DNA和染色质都是   总是与结合蛋白结合,组织它们   结构(1; 2; 3)。许多这些建筑蛋白质都是   可以在两个或多个不同DNA位点结合的分子桥   形成循环。例如,细菌DNA被环状和压实   histonelike蛋白H-NS,具有两个不同的DNA结合域   (4)。在真核生物中,转录因子和RNA的复合物   聚合酶稳定增强子 - 启动子环(5; 6; 7; 8),而   HP1(9),组蛋白H1(10)和polycomb-阻遏物复合物PRC1 / 2   (11; 12)组织无活性的染色质。蛋白质也与特异性结合   DNA序列形成更大的结构,如核仁和核仁   组蛋白基因座,或Cajal和promyeloleukemia机构(13; 14; 15; 16;   17; 18)。分子桥对活性和分子的选择性结合   染色质的非活性区域也被突出显示为一个   拓扑形成的潜在机制   相关结构域(TADs) - 富含局部DNA相互作用的区域(6; 8   ; 19)。

我希望它的形式为:

  

在所有生物体中,从细菌到人类,DNA和染色质都是   总是与结合蛋白结合,组织它们   结构体 。许多这些建筑蛋白质是分子桥   可以在两个或多个不同的DNA位点结合形成环。对于   例如,细菌DNA通过组蛋白形成环状和压实   蛋白质H-NS,具有两个不同的DNA结合结构域。在   真核生物,转录因子复合物和RNA聚合酶   稳定增强子 - 启动子环,而HP1,组蛋白H1,和   polycomb-阻遏复合物PRC1 / 2组织非活性染色质。   蛋白质也与特定的DNA序列结合形成更大的DNA序列   结构,如核仁和组蛋白基因座,或Cajal和   早幼粒细胞白血病的身体。分子桥的选择性结合   染色质的活性和非活性区域也被突出显示   作为拓扑形成的一个可能机制   相关结构域(TADs) - 富含局部DNA相互作用的区域。

我的尝试如下:

import re
x=re.sub(r'\(.+;  \d+\)', '', x) # eliminate brackets with multiple numbers
#### NOTE: there are 2 spaces between the last ';' and the last digit
x=re.sub(r'\d+\)', '', x) # eliminate brackets with single number

我的输出是这样的:

  

在所有生物体中,从细菌到人类,DNA和染色质都是   总是与结合蛋白结合,组织它们   结构。

很清楚,我的代码遗漏了一些东西。我认为'(。+)'会识别包含非任意字符的所有括号,然后我可以进一步指定我想要所有以';结尾的';数”。

我只想要一种灵活的方法,用'(数字'和'数字)'在所有地方索引一个句子,并消除它们之间的所有内容....

4 个答案:

答案 0 :(得分:0)

您可以使用类似\(\d+(?:;\s?\d+\s?)*\)的模式,该模式匹配初始括号和数字( <number>,然后使用以; <number>结尾的任何可能的重复)Test it.

或者,如果您感到勇敢,可以使用\([;\d\s]+\),它只是匹配两个括号之间的数字/空格/分号的所有内容。 Test it.

答案 1 :(得分:0)

尝试以下正则表达式:

r'\s\((\d+\s?;?\s?)+\)'

此正则表达式将匹配括号内的一组或多组数字(后跟空格/分号)。

在收集数字之前似乎总是有一个空格,所以匹配它应该有助于“尾随空格”。

答案 2 :(得分:0)

也许你可以尝试使用模式

re.sub('\([0-9; ]+\)', '', x)

删除至少包含一个数字的所有括号,“;”或空间。

我认为使用r前缀并非如此。

答案 3 :(得分:0)

我发现预期文字出现故障,PRC1/2后遗失了1个空格。但是这个代码可以工作,并将该空间添加回来:

text="""
In all living organisms, from bacteria to man, DNA and chromatin are invariably
associated with binding proteins, which organize their structure (1; 2 ; 3).
Many of these architectural proteins are molecular bridges that can bind at two
or more distinct DNA sites to form loops. For example, bacterial DNA is looped
and compacted by the histonelike protein H-NS, which has two distinct
DNA-binding domains (4). In eukaryotes, complexes of transcription factors and
RNA polymerases stabilize enhancer-promoter loops (5; 6; 7 ; 8), while HP1 (9),
histone H1 (10), and the polycomb-repressor complex PRC1/2 (11 ; 12) organize
inactive chromatin. Proteins also bind to specific DNA sequences to form larger
structures, like nucleoli and the histone-locus, or Cajal and promyeloleukemia
bodies (13; 14; 15; 16; 17 ; 18). The selective binding of molecular bridges to
active and inactive regions of chromatin has also been highlighted as one
possible mechanism underlying the formation of topologically associated domains
(TADs)—regions rich in local DNA interactions (6; 8 ; 19).
""".replace('\n', ' ')

expected="""
In all living organisms, from bacteria to man, DNA and chromatin are invariably
associated with binding proteins, which organize their structure . Many of
these architectural proteins are molecular bridges that can bind at two or more
distinct DNA sites to form loops. For example, bacterial DNA is looped and
compacted by the histonelike protein H-NS, which has two distinct DNA-binding
domains . In eukaryotes, complexes of transcription factors and RNA polymerases
stabilize enhancer-promoter loops , while HP1 , histone H1 , and the
polycomb-repressor complex PRC1/2  organize inactive chromatin. Proteins also
bind to specific DNA sequences to form larger structures, like nucleoli and the
histone-locus, or Cajal and promyeloleukemia bodies . The selective binding of
molecular bridges to active and inactive regions of chromatin has also been
highlighted as one possible mechanism underlying the formation of topologically
associated domains (TADs)—regions rich in local DNA interactions .
""".replace('\n', ' ')

import re

cites = r"\(\s*\d+(?:\s*;\s+\d+)*\s*\)"

edited = re.sub(cites, '', text)

i = 0
while i < len(edited):
    if edited[i] == expected[i]:
        print(edited[i], sep='', end='')
    else:
        print('[', edited[i], ']', sep='', end='')
    i+=1

print('')

我正在使用的正则表达式是cites,它看起来像这样:

r"\(\s*\d+(?:\s*;\s+\d+)*\s*\)"

语法r"..."的意思是“原始”,这对我们来说意味着“只留下反斜杠!”这是你应该(几乎)总是用于正则表达式。

外部\(\)匹配引文中的实际内容。

\s*匹配零个或多个“空格”字符,其中包括空格,制表符和换行符。

\d+匹配一个或多个数字[0..9]。

首先,有一个正则表达式:

\( \s* \d+ \s* \)

这只是“围绕一个数字的parens,可能在之前或之后有空格。”

内在部分,

(?:\s*;\s+\d+)*

说“不捕获”:(?:...)是一个非捕获组,因为我们不关心\ 1或从模式中获取任何东西,我们只想删除它。 / p>

\s*;匹配分号前的可选空格。

\s+\d+在另一个数字之前匹配所需空格 - 如果您有类似“(1; 3; 5)”的内容,则可能必须创建这些可选空格。

非捕获组之后的*表示出现零次或多次。

把它们放在一起,你有:

open-paren
optional spaces
number
followed by zero or more of:
    optional spaces
    semicolon
    required spaces
    number
optional spaces
close-paren