我有以下在Python正則表達式,正則表達式匹配
^1?$|^(11+?)\1+$
由於存在管「|」,我將其分割爲2的正則表達式,
^1?$
對於這一點,應該驗證1或空值。我對麼?
^(11+?)\1+$
對於上述正則表達式,這將驗證的1111值的第一對11基於(11+α)和所述第二對11是由於\ 1。
當我嘗試在Python中執行它時,它僅對1111返回true,但不是11或空值。我在哪裏錯了嗎?
我有以下在Python正則表達式,正則表達式匹配
^1?$|^(11+?)\1+$
由於存在管「|」,我將其分割爲2的正則表達式,
^1?$
對於這一點,應該驗證1或空值。我對麼?
^(11+?)\1+$
對於上述正則表達式,這將驗證的1111值的第一對11基於(11+α)和所述第二對11是由於\ 1。
當我嘗試在Python中執行它時,它僅對1111返回true,但不是11或空值。我在哪裏錯了嗎?
特德說:
爲此,應驗證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+
) ,情況並非如此(不重複)。
你有一個+
後\1
意味着1貪婪或更多。
你想要匹配1
1到4次嗎?
用途:
r'^(1+){1,4}$'
最簡單的方法是使用的偉大正則表達式的工具之一在那裏。這裏是my favorite.在同一個網站,你可以看到爲什麼your regex does not work。
這是一個網站,explains regex's。
在'\ 1'之後有或沒有'+',輸入'「11」'仍然不匹配,空字符串_will_匹配。換句話說:就我所知,「+」不是問題所在。除非我誤解事情...... –
@Bart Kiers:那麼OP有沒有想要做什麼;-)我把它解釋爲他想分割一個正則表達式,並且第二個匹配與1,11 ,111或1111.他的正則表達式只匹配1111。 – dawg
Err,no,'「1」'也匹配。我同意你的看法,但有點不清楚! :) –
如果您希望第二個表達式匹配'11','1111','111111'等用途:
^(1+)\1$
我認爲你需要更多的括號定義|
指的是什麼。我會寫這樣的正則表達式:
/^(1?|^(11+?)\2+)$/
音符只有一個起點和終點使用
不,它與'^ 1?$ | ^(11 +?)\ 1 + $'完全相同 –
嗯,黃金VS-合數的一元表示法通過正則表達式? – tchrist
是的,試圖爲它寫一個正則表達式。你很好。 :) – Ted
@ tchrist,很好地發現!當我看到它匹配'111111111'(9'1')後,我有點難過,然後它發生在我身上,'\ 1 +'匹配了3次3'1'。 :) –