簡體   English   中英

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

[英]How do I do Python re.search substrings with multi-character wildcard?

我正在嘗試從Python中的字符串中提取子字符串。 要修剪的前端是靜態的,易於實現,但是后端具有一個可以從“ _0”到“ _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

效果更好,但仍添加了計數器“ _0”。

如何進行健壯的修剪來修剪多字符計數器?

在您的正則表達式(?<=runid_).*?(?=_*.fastq)存在一個小問題。 您已寫出_* ,表示零個或多個下划線,這將使下划線成為可選內容,並跳過與之匹配的內容.*? 也會在里面吃_0 ,這就是為什么結果也是_0 我認為您的意思是_.*並且也應該轉義. 就在fastq之前,所以您更新后的正則表達式應該變成這個,

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

演示版

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

另外,您也可以使用不帶環視功能的簡單正則表達式,並使用此正則表達式從第一組中捕獲文本,

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

演示版

group(1)而不是group(0)選擇文本的python代碼

import re

text = "fastq_runid_0dc971f49c42ffb1412caee485f8421a1f9a26ed_0.fastq"

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

print(substring)

在這種情況下,它也會打印

0dc971f49c42ffb1412caee485f8421a1f9a26ed

您不需要落后,也不必先展望。

\\d{1,4}表示min 1 max 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)將提供計數器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM