2012-07-28 72 views
0

我正在寫一個python正則表達式,通過文本文件查看引用的字符串(從黑匣子錄製的航空公司飛行員的報價)。我開始嘗試使用以下規則編寫正則表達式:Python中的括號奇怪的行爲正則表達式

返回引號之間的內容。
如果它以單個打開,只有在關閉時才返回。
如果以double打開,只有在以double打開時才返回。

例如,我不想匹配「hi there」或「hi there」,但「hi there」和「hi there」。

我用一個測試網頁,其中包含了諸如:

CA "Runway 18, wind 230 degrees, five knots, altimeter 30." 
AA "Roger that" 
18:24:10 [flap lever moving into detent] 
ST: "Some passenger's pushing a switch. May I?" 

所以我決定開始簡單:

re.findall('("|\').*?\\1', page) 
########## /("|').*?\1/ <-- raw regex I think I'm going for. 

此正則表達式的作用非常意外。
我以爲它會:

  1. ( 「|」)匹配單個或雙引號,保存爲恢復參照/ 1。
  2. 。*?匹配非貪婪通配符。
  3. \ 1匹配它在後向參考\ 1中找到的任何內容(步驟一)。

相反,它返回一個引用數組,但從來沒有其他的東西。

['"', '"', "'", "'"] 

我很困惑,因爲等效(afaik)正則表達式在VIM中工作得很好。

\("\|'\).\{-}\1/) 

我的問題是這樣的:
爲什麼它僅僅返回的是括號內爲匹配?這是我對後向引用理解的缺陷嗎?如果是這樣,那麼爲什麼它在VIM中工作?

我如何編寫正在尋找的Python中的正則表達式?

謝謝你的幫助!

回答

0

閱讀the documentation。如果有的話,re.findall返回組。如果您想要整場比賽,則必須將其全部分組,或使用re.finditer。請參閱this question

+0

該文件仍然沒有意義,因爲我認爲羣體意味着潛在的匹配,而不是控制組。感謝您解決這個問題。 – 2012-07-28 19:15:36

1

您需要用一對額外的括號來捕捉所有內容。

re.findall('(("|\').*?\\2)', page) 
3

除了引用之外,您不捕獲任何內容,這是Python返回的內容。

如果添加另一個組,工作的事情要好得多:

for quote, match in re.finditer(r'("|\')(.*?)\1', page): 
    print match 

我爲前綴的字符串字面量與r,使之成爲串,當你需要使用一噸,這是有用反斜槓(\\1變成\1)。

+0

太棒了!但是,這是否意味着如果表達的一部分在對照組中,那麼其他一切都必須在對照組中? – 2012-07-28 19:07:32

+0

匹配組中的內容是使用正則表達式搜索時返回的內容。如果你想讓整個正則表達式匹配,你可以將所有內容都包含在一個組中。 – Blender 2012-07-28 19:40:43