簡體   English   中英

如何從字符串中的某個索引開始使用re.search?

[英]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功能上使用posendpos參數。


通常,最常見的原因是“在我剛剛找到的比賽之后找到下一個比賽”,並且有一種更簡單的方法:使用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)

正則表達式可視化

Debuggex演示

如果提供此abcdefabcdef ,它將匹配第三個字符后的第一個'abc' ,即第二個abc

但是請注意,它實際上與'defabc'相匹配。 因為我將捕獲組用於我的真實模式,並且沒有將.{3}放在組中, match.group(1)等將完全按照我希望的方式工作,但可以match.group(0)會給我錯誤的信息。 如果那很重要,則需要向后看。

暫無
暫無

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

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