2017-08-05 219 views
-4

下面的正則表達式

moo = re.compile(r'^\d+$') 

將搜索剛剛開始,並以數字字符結尾的字符串。示例可以是11234,44332,123321321等。

但是正則表達式不匹配12321xyz12312。這個字符串也以數字開頭和結尾,這就是我的正則表達式需要匹配一個字符串!那爲什麼我的正則表達式不匹配這個字符串呢?

+2

「正則表達式'moo = re.compile(r'^ \ d + $')'會搜索一個剛剛開始並以數字字符結尾的字符串。」 - 不。如果你解釋你爲什麼這麼想,我們可以解釋你的誤解。 – user2357112

+0

如果你想匹配一個剛剛開始和結束的數字字符串,你可以使用're.compile(r'^ \ d。* \ d $')' –

+1

@cᴏʟᴅsᴘᴇᴇᴅ:除了不匹配像'1'這樣的單個數字字符串,所以如果你想匹配那些(你可能會這樣做),你需要特殊情況或使用lookaround斷言或只是不使用正則表達式或其他東西。 – user2357112

回答

4

我想你錯誤地理解了開始和結束匹配器的工作方式。

^\d+$不會簡單匹配以數字結尾並以數字開頭的字符串。它說:

  • 去串(^
  • 匹配一個數字(\d
  • 匹配儘可能多的這些數字的地(+
  • 現在繼續嘗試的開始匹配這些直到字符串的末尾($

12321xyz12312不匹配,因爲它匹配後12321,它會嘗試匹配字符串的末尾。但它還沒有結束,所以字符串不匹配!

這裏是一個正則表達式,你想要做什麼:

^\d(.*\d)?$ 

這表達式將匹配如下:

YES 0 
NO x0 
NO 0x 
YES 00 
YES 000 
YES 0x0 
YES 00x00 
YES 000xxx000 
+0

您能否給我一個正則表達式來匹配一個字符串,該字符串的兩端都有數字,不管它裏面有哪些字符? –

+0

@ M.Hamel你看到我的[評論](https://stackoverflow.com/questions/45517557/why-is-d-matching-a-string-that-is-fully-numeric?noredirect=1#comment77996423_45517557 ) –

+0

我更新了正則表達式。以前的版本不需要正確的數字。 – Soviut

1

"^\d+$"表示「開始"^"和結束"$"之間的一個或多個十進制數字"\d+"」。 xyz不是十進制數字。

1

我想你誤會了正則表達式。它匹配「字符串開頭」(^),緊跟着「一個或多個0-9個字符」(\d+-\d[0-9]相同或0|1|2|3|4|5|6|7|8|9+表示「重複一次或多次」)緊接着是「結束字符串「($)。

也就是說,^ ... $的意思是「只匹配與...相同的字符串」(而不是「匹配包含它的字符串」)。