[英]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
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.