使用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)