使用Python中的re.search(pattern,text)在两个指定的子字符串之间提取子字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python中的re.search(pattern,text)在两个指定的子字符串之间提取子字符串相关的知识,希望对你有一定的参考价值。

我有一个类似"ENST00000260682_3_4_5_6_7_8_9_BS_673.6"的字符串。我必须在re.search()中使用正则表达式来提取子字符串,并将其写入Python这样的列表中,例如[3, 4, 5, 6, 7, 8, 9]

我尝试过,

text="ENST00000260682_3_4_5_6_7_8_9_BS_673.6"
pattern=re.compile(r"^[[A-Z0-9]*_[.*]_BS]")
a=re.search(pattern, text)
print(a.group())

它返回,'none',还有AttributeError: 'NoneType' object has no attribute 'group'

请帮助我。

答案

_BS之前的下划线之后搜索所有数字:

import re
text="ENST00000260682_3_4_5_6_7_8_9_BS_673.6"
pattern=re.compile(r"_(\d+)")
a=re.findall(pattern, text[:text.find('_BS')])
print(a)

输出:['3', '4', '5', '6', '7', '8', '9']

或根据需要将它们强制转换为int:

a=[int(x) for x in re.findall(pattern, text[:text.find('_BS')])]
另一答案

您可以使用生成器而不是正则表达式轻松实现这一点:

def num_gen(s, delimiter='_', start_index=1, stop_token='BS'):
    # delimiter: the char you want to split your text for
    # start_index: where your want to start retrieving values
    # stop_token: stop retrieving when the token is encountered

    for x in s.split(delimiter)[start_index:]:
        if x != stop_token:
            yield x
        else:
            return

用法:

t = "ENST00000260682_3_4_5_6_7_8_9_BS_673.6"
list(num_gen(t))

# ['3', '4', '5', '6', '7', '8', '9']

[如果可能,我建议除非必要,否则避免使用正则表达式,如果您不熟悉,请尤其是。这是一个relevant quote

有些人在遇到问题时会想 “我知道,我将使用正则表达式。” 现在他们有两个问题。

正则表达式有用的时间和空间。但在此之前,请不要不必要地将其添加为问题的一部分。

以上是关于使用Python中的re.search(pattern,text)在两个指定的子字符串之间提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用Python中的re.search(pattern,text)在两个指定的子字符串之间提取子字符串

python)使用正则表达式查找所有匹配项(从 re.search 更改为 re.findall)[重复]

在 python 列表中使用正则表达式(re.search)

Python re.search和re.findall的比较

Python之re操作

Python3中正则模块re.compilere.match及re.search