如何匹配以@
開頭並以;
,.
,:
或
結尾的單詞?匹配@正則表達式的用戶
單詞可以包含任何字母數字字符,並且可以由下劃線組成。
我想出了^@([a-zA-Z0-9_])*[:;, ]$
這似乎只適用於單個單詞句子。
如何匹配以@
開頭並以;
,.
,:
或
結尾的單詞?匹配@正則表達式的用戶
單詞可以包含任何字母數字字符,並且可以由下劃線組成。
我想出了^@([a-zA-Z0-9_])*[:;, ]$
這似乎只適用於單個單詞句子。
^
匹配字符串的開始(或線,在多行模式),而$
結束比賽,所以你需要擺脫他們:
>>> 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;']
(當然,長度的限制,可以添加到任何先前的表現,而不僅僅是個是最後一個)。
啊!現在我得到它,我把*放在捕獲組之外。謝謝! –
只要刪除錨點^
和$
,你將很好去。
如果您不想匹配"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})[:;, ]
如果令牌是正確的字符串的結束和沒有特殊字符,你想捕捉它,你可能希望修改[:;, ]
到(?:[:;, ]|$)
由於這是Twitter,我們正在討論,您可能會想限制爲15個字符(用戶名最大長度) –