2012-06-03 81 views
1

正則表達式的新手在這裏,我將不勝感激任何幫助。python正則表達式與可選組

cstring = "[0,90,(+45,45)3,0/]S" 
regex = re.compile(r'^(\[)(\S+)(\/?)(\][ST]$)') 
match = regex.search(cstring) 
for s in match.groups(): 
    print s 

的結果是 「[」 「0.90,(+ 45,45)3,0 /」 「] S」,但我想獲得在一個單獨的(和任選的 「/」 - 的只有一個從上面)組。我嘗試用[0-9(),+ - ] - (這些是第二組中預期的唯一字符)替換\ S,但無濟於事。

回答

3

正則表達式的數量說明符+和*是貪婪的,你可以添加一個?到他們的最後(+?和*?)將它們變成非貪婪形式。

貪婪意味着操作員會在檢查下一個標記之前嘗試消耗所有可能的東西。

所以對於

\S+\/? 

的情況下,S將嘗試消耗一切可能的檢查/之前,而隨着/可選沒有什麼需要爲它做。

一旦我們將它變成非貪婪形式

\S+?\/? 

的S將盡可能少地消耗嘗試/這意味着/獲取「第一的DIB」上的任何令牌之前,一旦失敗抓住他們這些代幣將被用來對付\ S +?

我發現成功使用下列內容:

regex = re.compile(r'^(\[)(\S+?)(\/?)(\][ST]$)') 

欲瞭解更多信息,你可以看到the python re docs搜索貪婪。

彷彿你通過了re.VERBOSE選項爲re.compile那麼它會忽略你的字符串中的空白意味着你可以構建它作爲

regex = re.compile(r'^ (\[) (\S+?) (\/?) (\][ST]$) ', re.VERBOSE) 

我學習正則表達式的時候發現非常有用旁註。

此外,您還有一個字符串標記開始於組'^(['但是組''(] [ST] $)'內的字符串標記的結尾),除了可讀性外,這不應該有所作爲。 。

+0

謝謝,這是我一直在尋找for。 – LeeUser1335457

0

嘗試使用您\S人物非貪婪匹配該小組正席捲你的/性格

改變你的正則表達式來這工作對我來說:

cstring = "[0,90,(+45,45)3,0/]S" 
regex = re.compile(r'^(\[)(\S+?)(\/?)(\][ST]$)') 
match = regex.search(cstring) 
for s in match.groups(): 
    print s 
+0

感謝Blender,i噸現在排序 – LeeUser1335457