2012-06-11 48 views
1

如何匹配以@開頭並以;.: 結尾的單詞?匹配@正則表達式的用戶

單詞可以包含任何字母數字字符,並且可以由下劃線組成。

我想出了^@([a-zA-Z0-9_])*[:;, ]$這似乎只適用於單個單詞句子。

+0

由於這是Twitter,我們正在討論,您可能會想限制爲15個字符(用戶名最大長度) –

回答

3

^匹配字符串的開始(或線,在多行模式),而$結束比賽,所以你需要擺脫他們:

>>> import re 
>>> sentence = "foo bar @match don't match @success;" 
>>> re.findall('@([a-zA-Z0-9_])*[:;, ]', sentence) 
['h', 's'] 

它僅捕獲最後一個字母,因爲限定符(*)位於與捕獲匹配的括號之外。中移動它,你會得到:

>>> re.findall('@([a-zA-Z0-9_]*)[:;, ]', sentence) 
['match', 'success'] 

如果你想捕捉的@和尾隨字符也一樣,只要將他們的括號內還有:

>>> re.findall('(@[a-zA-Z0-9_]*[:;, ])', sentence) 
['@match ', '@success;'] 

而且隨着在評論中提到的問題,你可能會或可能不希望將其限制在一定數目的字符:

>>> sentence = "foo bar @match don't match @somereallylongnamehere @success;" 
>>> re.findall('(@[a-zA-Z0-9_]{1,15}[:;, ])', sentence) 
['@match ', '@success;'] 

(當然,長度的限制,可以添加到任何先前的表現,而不僅僅是個是最後一個)。

+1

啊!現在我得到它,我把*放在捕獲組之外。謝謝! –

4

只要刪除錨點^$,你將很好去。

如果您不想匹配"Example @ nothing"的空字符串,您可能需要指定「1個或多個限定符」+而不是*。即@([a-zA-Z0-9_]+)[:;, ]

限制到1-15字符的用戶名可通過用{1,15}替換*來完成,即@([a-zA-Z0-9_]{1,15})[:;, ]

如果你想得到@符號加結尾字符作爲結果,@[a-zA-Z0-9_]{1,15}[:;, ]就足夠了。

如果你想只捕獲的名字,你可以使用這個@([a-zA-Z0-9_]{1,15})[:;, ]

如果令牌是正確的字符串的結束和沒有特殊字符,你想捕捉它,你可能希望修改[:;, ](?:[:;, ]|$)