[英]How do I use re.search starting from a certain index in the string?
似乎很簡單,但我沒有看到。 如何在字符串中間開始搜索?
re.search
函數不像str
方法那樣采用start
參數。 但是,已編譯的re.compile
/ re.RegexObject
模式的search
方法確實帶有pos
參數。
如果您考慮一下,這是有道理的。 如果確實需要一遍又一遍地使用相同的正則表達式,則可能應該對其進行編譯。 效率不是很重要-緩存對於大多數應用程序都很好用-只是為了提高可讀性。
但是,如果由於某種原因由於無法預先編譯模式而需要使用頂層函數怎么辦?
好吧,有很多第三方正則表達式庫。 其中一些包裝了PCRE或Google的RE2或ICU,一些包裝從頭實現了正則表達式,並且它們都至少具有略有不同,有時甚至根本不同的API。
但是regex
模塊(最終旨在替代stdlib中的re
(盡管由於尚未准備好而被撞了幾次,因為它可以作為re
替代品,並且(在其中)其他擴展名),則在其search
功能上使用pos
和endpos
參數。
通常,最常見的原因是“在我剛剛找到的比賽之后找到下一個比賽”,並且有一種更簡單的方法:使用finditer
而不是search
。
例如,以下str-method循環:
i = 0
while True:
i = s.find(sub, i)
if i == -1:
break
do_stuff_with(s, i)
…轉化為更好的正則表達式循環:
for match in re.finditer(pattern, s):
do_stuff_with(match)
如果不合適,您可以隨時對字符串進行切片:
match = re.search(pattern, s[index:])
但這會額外復制一半的字符串,如果string
實際上是一個12GB的mmap
,那么這可能是個問題。 (當然,對於12GB的mmap
情況,您可能希望映射一個新窗口……但是在某些情況下這無濟於事。)
最后,您始終可以修改模式以跳過index
字符:
match = re.search('.{%d}%s' % (index, pattern), s)
我在這里所做的只是在模式的開頭添加.{20}
,這意味着要精確匹配任何字符中的20個,再加上您要匹配的其他任何字符。 這是一個簡單的例子:
.{3}(abc)
如果提供此abcdefabcdef
,它將匹配第三個字符后的第一個'abc'
,即第二個abc
。
但是請注意,它實際上與'defabc'
相匹配。 因為我將捕獲組用於我的真實模式,並且沒有將.{3}
放在組中, match.group(1)
等將完全按照我希望的方式工作,但可以match.group(0)
會給我錯誤的信息。 如果那很重要,則需要向后看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.