我正在尝试从Python中的字符串中提取子字符串。 要修剪的前端是静态的,易于实现,但是后端具有一个可以从“ _0”到“ _9999”的计数器。
使用我当前的代码,计数器仍包含在子字符串中。
Bx
返回
0dc971f49c42ffb1412caee485f8421a1f9a26ed_0.fas
或者,
import re
text = "fastq_runid_0dc971f49c42ffb1412caee485f8421a1f9a26ed_0.fastq"
print(text)
substring= re.search('runid_(.*)_*.fas', text).group(0)
print(substring)
返回
0dc971f49c42ffb1412caee485f8421a1f9a26ed_0
效果更好,但仍添加了计数器“ _0”。
如何进行健壮的修剪来修剪多字符计数器?
答案 0 :(得分:1)
在您的正则表达式(?<=runid_).*?(?=_*.fastq)
中,存在一个小问题。您编写了_*
,这意味着零个或多个下划线将使下划线成为可选内容,并将跳过它的匹配,而您的.*?
也将在其中吃掉_0
,这就是为什么您得到{ {1}}。我认为您的意思是_0
,并且也应该在_.*
之前转义.
,以便您更新后的正则表达式应成为这个,
fastq
您更新的python代码,
(?<=runid_).+(?=_\d{1,4}\.fas)
打印
import re
text = "fastq_runid_0dc971f49c42ffb1412caee485f8421a1f9a26ed_0.fastq"
print(text)
substring= re.search('(?<=runid_).+(?=_\d{1,4}\.fas)', text).group(0)
print(substring)
或者,您也可以使用不带环视功能的简单正则表达式,并使用此正则表达式捕获第一组文本,
0dc971f49c42ffb1412caee485f8421a1f9a26ed
您的python代码具有从runid_([^_]+)(?=_\d{1,4}\.fas)
而不是group(1)
挑选文本的功能
group(0)
在这种情况下,它也会打印
import re
text = "fastq_runid_0dc971f49c42ffb1412caee485f8421a1f9a26ed_0.fastq"
print(text)
substring= re.search('runid_([^_]+)(?=_\d{1,4}\.fas)', text).group(1)
print(substring)
答案 1 :(得分:1)
您不需要回头再向前看即可。
\d{1,4}
表示min 1
max 4
位数字,否则将不匹配
fastq_runid_(.+)_\d{1,4}\.fastq
答案 2 :(得分:1)
import re
text = "fastq_runid_0dc971f49c42ffb1412caee485f8421a1f9a26ed_999.fastq"
print(text)
substring= re.search('fastq_runid_(\w+)_(\d+)\.fastq', text)
print(substring.group(1), substring.group(2))
group(1)
将给出您想要的东西,group(2)
将给出计数器。