Regular-Expression

為什麼 re.search 會以不同的方式處理這些模式?

  • January 10, 2019

我經常使用sagetex,它是用 python 編寫的。

包中的一個腳本定義了一個像這樣的變數:

ignore = r"^( _st_.goboom|print 'SageT| ?_st_.current_tex_line)"

然後腳本使用re.find如下:

re.search(ignore, line)

最近,為了準備切換到python 3,將ignore變數更改為

ignore = r"^( _st_.goboom|print('SageT| ?_st_.current_tex_line))"

出於某種原因,此更改導致我的某些文件出現問題。

ignore我的問題是:如果要在中使用變數的這兩個定義之間有什麼區別re.search嗎?

顯然,如果我可以發佈為什麼這會給我帶來問題,那將會很有用,但是腳本有點長,而且我使用腳本的項目很長。

簡而言之:腳本使用 的第一個定義返回正確的結果,ignore腳本始終返回False的第二個定義ignore

我希望這兩個定義ignore導致不同的行為有一個明顯的原因。

更新的正則表達式缺少先前正則表達式所具有的空間。

ignore = r"^( _st_.goboom|print 'SageT| ?_st_.current_tex_line)"
ignore = r"^( _st_.goboom|print('SageT| ?_st_.current_tex_line))"

我認為想要的只是

ignore = r"^( _st_.goboom|print ('SageT| ?_st_.current_tex_line))"

至於解釋……通常,正則表達式中的空格是文字字元。

現在,我承認,這可能是變化本身。你從說你會忽略

" _st_.goboom"
"print 'SageT"
"_st.current_tex_line"
" _st.current_tex_line"

忽略

" _st_.goboom"
"print 'SageT"
"print '_st.current_tex_line"
"print ' _st.current_tex_line"

(注意:正則表達式中的所有 ‘.’ 字元也匹配任何字元,但我不希望有 258 * 6 行左右的行來準確解釋被忽略的模式。)

引用自:https://unix.stackexchange.com/questions/493579