Python如何使用多字符通配符重新搜索子字符串?

时间:2019-01-23 04:43:31

标签: python regex string substring

我正在尝试从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”。

如何进行健壮的修剪来修剪多字符计数器?

3 个答案:

答案 0 :(得分:1)

在您的正则表达式(?<=runid_).*?(?=_*.fastq)中,存在一个小问题。您编写了_*,这意味着零个或多个下划线将使下划线成为可选内容,并将跳过它的匹配,而您的.*?也将在其中吃掉_0,这就是为什么您得到{ {1}}。我认为您的意思是_0,并且也应该在_.*之前转义.,以便您更新后的正则表达式应成为这个,

fastq

Demo

您更新的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

Demo

您的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

https://regex101.com/r/VneElM/1

答案 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)将给出计数器。