2011-09-26 220 views
4

我有以下在Python正則表達式,正則表達式匹配

^1?$|^(11+?)\1+$ 

由於存在管「|」,我將其分割爲2的正則表達式,

^1?$ 

對於這一點,應該驗證1或值。我對麼?

^(11+?)\1+$ 

對於上述正則表達式,這將驗證的1111值的第一對11基於(11+α)和所述第二對11是由於\ 1。

當我嘗試在Python中執行它時,它僅對1111返回true,但不是11或空值。我在哪裏錯了嗎?

+3

嗯,黃金VS-合數的一元表示法通過正則表達式? – tchrist

+0

是的,試圖爲它寫一個正則表達式。你很好。 :) – Ted

+0

@ tchrist,很好地發現!當我看到它匹配'111111111'(9'1')後,我有點難過,然後它發生在我身上,'\ 1 +'匹配了3次3'1'。 :) –

回答

2

特德說:

爲此,應驗證1或空值。我對麼?

是的,這是正確的。

特德說:

當我嘗試在Python執行它,它返回true只爲1111而不是11或空值。我在哪裏錯了嗎?

空字符串確實得到匹配。下面的代碼片斷:

#!/usr/bin/env python 
import re 

for n in xrange(0, 51): 
    ones = '1' * n 
    matches = re.match(r'^1?$|^(11+?)\1+$', ones) 
    if matches: 
    div1 = n if matches.group(1) is None else len(matches.group(1)) 
    div2 = 0 if div1 is 0 else len(ones)/div1 
    print "[{0:2}]:{1:2} * {2:2} = '{3}'".format(n, div1, div2, ones) 

將打印:

[ 0]: 0 * 0 = '' 
[ 1]: 1 * 1 = '1' 
[ 4]: 2 * 2 = '1111' 
[ 6]: 2 * 3 = '111111' 
[ 8]: 2 * 4 = '11111111' 
[ 9]: 3 * 3 = '111111111' 
[10]: 2 * 5 = '1111111111' 
[12]: 2 * 6 = '111111111111' 
[14]: 2 * 7 = '11111111111111' 
[15]: 3 * 5 = '111111111111111' 
[16]: 2 * 8 = '1111111111111111' 
[18]: 2 * 9 = '111111111111111111' 
[20]: 2 * 10 = '11111111111111111111' 
[21]: 3 * 7 = '111111111111111111111' 
[22]: 2 * 11 = '1111111111111111111111' 
[24]: 2 * 12 = '111111111111111111111111' 
[25]: 5 * 5 = '1111111111111111111111111' 
[26]: 2 * 13 = '11111111111111111111111111' 
[27]: 3 * 9 = '111111111111111111111111111' 
[28]: 2 * 14 = '1111111111111111111111111111' 
[30]: 2 * 15 = '111111111111111111111111111111' 
[32]: 2 * 16 = '11111111111111111111111111111111' 
[33]: 3 * 11 = '111111111111111111111111111111111' 
[34]: 2 * 17 = '1111111111111111111111111111111111' 
[35]: 5 * 7 = '11111111111111111111111111111111111' 
[36]: 2 * 18 = '111111111111111111111111111111111111' 
[38]: 2 * 19 = '11111111111111111111111111111111111111' 
[39]: 3 * 13 = '111111111111111111111111111111111111111' 
[40]: 2 * 20 = '1111111111111111111111111111111111111111' 
[42]: 2 * 21 = '111111111111111111111111111111111111111111' 
[44]: 2 * 22 = '11111111111111111111111111111111111111111111' 
[45]: 3 * 15 = '111111111111111111111111111111111111111111111' 
[46]: 2 * 23 = '1111111111111111111111111111111111111111111111' 
[48]: 2 * 24 = '111111111111111111111111111111111111111111111111' 
[49]: 7 * 7 = '1111111111111111111111111111111111111111111111111' 
[50]: 2 * 25 = '11111111111111111111111111111111111111111111111111' 

和輸入11因爲11在組1((11+?))匹配不匹配,這然後應重複至少一次(\1+) ,情況並非如此(不重複)。

+0

對於第一組正則表達式,^ 1?$,空值匹配,但爲什麼不匹配1或11?由於1適合^ 1和11中的匹配,適合1?中的匹配。 – Ted

+0

@Ted,空字符串和'「1」'匹配。看到我的(稍微)編輯答案。 –

+0

謝謝!我誤解了'(^ 1?$)'。我認爲這意味着1或11由於??元字符(零或一)。 – Ted

0

你有一個+\1意味着1貪婪或更多。

你想要匹配1 1到4次嗎?

用途:

r'^(1+){1,4}$' 

最簡單的方法是使用的偉大正則表達式的工具之一在那裏。這裏是my favorite.在同一個網站,你可以看到爲什麼your regex does not work

這是一個網站,explains regex's

+0

在'\ 1'之後有或沒有'+',輸入'「11」'仍然不匹配,空字符串_will_匹配。換句話說:就我所知,「+」不是問題所在。除非我誤解事情...... –

+0

@Bart Kiers:那麼OP有沒有想要做什麼;-)我把它解釋爲他想分割一個正則表達式,並且第二個匹配與1,11 ,111或1111.他的正則表達式只匹配1111。 – dawg

+0

Err,no,'「1」'也匹配。我同意你的看法,但有點不清楚! :) –

0

如果您希望第二個表達式匹配'11','1111','111111'等用途:

^(1+)\1$ 
0

我認爲你需要更多的括號定義|指的是什麼。我會寫這樣的正則表達式:

/^(1?|^(11+?)\2+)$/ 

音符只有一個起點和終點使用

+0

不,它與'^ 1?$ | ^(11 +?)\ 1 + $'完全相同 –