2014-10-27 78 views
0

開始的如何在開始時創建一個與所有沒有數字的字母數字匹配的正則表達式?正則表達式不是從數字

現在我有"^[0-9][a-zA-Z0-9_]"

例如,1AB將不匹配,AB1將匹配,1_bc將不匹配,BC_1將匹配。

+0

你的意思是從行開始啓動? – 2014-10-27 20:32:12

回答

2

有三件事情錯了你寫的是什麼。

首先,要否定字符類,請將^置於的括號內,而不是在它們之前。 ^[0-9]的意思是「任何數字,在字符串的開始處」; [^0-9]的意思是「除數字之外的任何東西」。

二,[^0-9]將匹配任何東西這不是一個數字,不只是字母和下劃線。你真的想說第一個字符「不是數字,而是數字,字母或下劃線」,對嗎?雖然這不是不可能這麼說,但將它合併爲「是字母還是下劃線」要容易得多。

此外,你忘了重複最後一個字符集。按原樣,你恰好匹配兩個字符,因此b1將起作用,但b12不會。

所以:

[a-zA-Z_][a-zA-Z0-9_]* 

Regular expression visualization

Debuggex Demo

在其他的話:一個字母或下劃線,其次是零或多個字母,數字或下劃線。

我不完全確定這是你真正想要的,至少如果正則表達式是你的整個解析器。例如,在foo-bar中,是否要使bar匹配?如果是這樣,在123spam中,您是否希望spam匹配?但這正是你想要寫的東西。

+0

$ abarnert謝謝你的回答(和Debuggex Demo的+1)。這正是我所需要的。 – Apollo 2014-10-27 20:38:59

0

這應做到:

^[^0-9][a-zA-Z0-9_]+$ 

釋:

  • ^:行
  • 的比賽beggining
  • [^0-9]:匹配的任何東西,但一個數字一個
  • [a-zA-Z0-9_]+:匹配一個或更多字母數字字符
  • $:匹配線
+0

我很確定這不是他想要的。畢竟,'-foo'在開頭沒有數字,所以它會匹配你的表情,但我不認爲這是他想要的。 – abarnert 2014-10-27 20:38:58

+0

@abarnert:沒錯。沒有意識到這一點。 – Linuxios 2014-10-27 20:39:40

+0

那麼,對於更完整的一組測試輸入應該會更好;我是_guessing_他不希望'-foo'基於他描述的方式,但是最好是......知道...... – abarnert 2014-10-27 20:41:09

0

結束時,您可以使用此:^[A-Za-z_][A-Za-z0-9_]*$

0

另一項建議,試試這個:

\b([a-zA-Z][^\s]*) 

您可以使用此代碼來遍歷結果:

reobj = re.compile(r"\b([a-zA-Z][^\s]*)") 
for match in reobj.finditer(subject): 
    start = match.start() 
    end = match.end() 
    text = match.group() 
0

你可以使用這個表達式:

^[a-z]\w+$ 

Working demo

enter image description here

正則表達式的想法是,

^[a-z] -> Have to start with a letter 
\w+$  -> can contain multiple alphanumeric characters (\w is the shortcut for [A-Za-z_]) 

請記住正則表達式標誌i的不敏感和m爲多。

可以使用

的Python代碼是:

import re 
p = re.compile(ur'^[a-z]\w+$', re.MULTILINE | re.IGNORECASE) 
test_str = u"would match\nab1\nbc_1\n\nwould not match\n1_bc\n1ab" 

re.findall(p, test_str)