2012-05-23 27 views
2

我希望在可能的字符範圍內有一個RegEx匹配一行中的幾個相同字符,但不會將這些模式匹配作爲一個模式返回。這如何實現?將具有相同潛在起始字符的分隔RegEx模式匹配

對於澄清:

我想與[A-C]開始和ungreedly返回任何數量的同一字符的,但不是其他字符的範圍內的圖案。在序 'aafaabbybcccc' 它會找到的模式:

( 'AA', 'AA', 'BB', 'B', '中交股份')

,但將排除以下幾點:

(「F」,「AABB」,「Y」,「bcccc」)

我不想使用多個正則表達式搜索,因爲我發現模式的順序將決定另一個函數的輸出。這個問題是爲了自學(python)而不是作業。 (我也不到15代表,但會回來,upvote當我可以。)

+1

'(A + | B + | C +)'應該工作。 – Vikas

+0

我認爲反向引用是一個更好的解決方案,而不是使用'|來匹配各個字符。更新了我的答案。 – Vikas

回答

2

好問題。使用正則表達式,如:

(?P<L>[a-c])(?P=L)+ 

這是更強大的 - 你不侷限於A-C,你可以用A-Z,如果你喜歡更換。它首先將a-c中的任何字符定義爲L,然後查看該字符是否再次出現一次或多次。你想運行這個正則表達式運行re.findall()

+0

這正是我所期待的。謝謝。 – Ceryn

+0

不客氣 - 很高興看到它的幫助。 – Ansari

+0

我實際上遇到了麻煩得到這個工作,但我不知道爲什麼。 test = re.findall('(?P [ac])(?P = L)+','abbracadabbra') - 剛返回測試結果爲['b','b'] - 是python問題? – Ceryn

1

您可以使用反向引用\1 - \9捕獲先前匹配的第1到第9組。

/([a-c])(\1+)/ 

[a-c]: Matches one of the character. 
\1+ : Matches subsequent one or more previously matched character. 

的Perl:

perl -e '@m = "ccccbbb" =~ /([a-c])(\1+)/; print $m[0], $m[1]' 

cccc 

的Python:

>>> import re 
>>> [m.group(0) for m in re.finditer(r"([a-c])\1+", 'aafaabbybcccc')] 
['aa', 'aa', 'bb', 'cccc'] 
+0

有趣。有沒有一個好的教程如何分組的作品? – Ceryn

+0

@Ceryn,[regular-expressions.info](http://www.regular-expressions.info/tutorial.html)有一個非常好的正則表達式教程。 [Chapter on grouping and backref](http://www.regular-expressions.info/brackets.html)可以很好地概述你想要什麼。 – Vikas

+0

謝謝我會檢查出來。 :) – Ceryn

相關問題