我该怎么做检索具有多字符通配符的子字符串?

2024-05-16 04:38:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从Python中的字符串中提取子字符串。 要修剪的前端是静态的,易于实现,但后端有一个计数器,可以从“\u 0”运行到“\u 9999”。你知道吗

在我当前的代码中,计数器仍然包含在子字符串中。你知道吗

import re

text = "fastq_runid_0dc971f49c42ffb1412caee485f8421a1f9a26ed_0.fastq"

print(text)
substring= re.search('runid_(.*)_*.fas', text).group(0)

print(substring)

退货

0dc971f49c42ffb1412caee485f8421a1f9a26ed_0.fas

或者

substring= re.search(r"(?<=runid_).*?(?=_*.fastq)", text).group(0)

退货

0dc971f49c42ffb1412caee485f8421a1f9a26ed_0

效果更好,但仍添加了计数器“\u 0”。你知道吗

我如何做一个强大的修剪修剪多字符计数器?你知道吗


Tags: 字符串代码textimportresearch静态group
3条回答

你不需要向后看,向前看就可以实现这个目标。你知道吗

\d{1,4}表示min 1max 4位,否则不匹配

fastq_runid_(.+)_\d{1,4}\.fastq

https://regex101.com/r/VneElM/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)将给出计数器。你知道吗

在regex (?<=runid_).*?(?=_*.fastq)中有一个小问题。你已经写了_*,这意味着零个或更多的下划线,这将使下划线成为可选的,并将跳过匹配,你的.*?也将在它里面吃_0,这就是为什么在你的结果中你也得到_0。我想你的意思是_.*,而且你应该在fastq之前避开.,所以你的更新正则表达式应该是这样的

(?<=runid_).+(?=_\d{1,4}\.fas)

Demo

更新的python代码

import re

text = "fastq_runid_0dc971f49c42ffb1412caee485f8421a1f9a26ed_0.fastq"

print(text)
substring= re.search('(?<=runid_).+(?=_\d{1,4}\.fas)', text).group(0)

print(substring)

指纹

0dc971f49c42ffb1412caee485f8421a1f9a26ed

另外,您也可以使用一个简单的正则表达式而不使用lookarounds,并使用这个正则表达式从第一个组捕获文本

runid_([^_]+)(?=_\d{1,4}\.fas)

Demo

python代码中的文本从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)

在这种情况下也会打印出来

0dc971f49c42ffb1412caee485f8421a1f9a26ed

相关问题 更多 >