、、、、またはで始まる単語@
と終わる単語を一致させるにはどうすればよいですか?;
.
:
単語には任意の英数字を使用でき、アンダースコアで構成できます。
^@([a-zA-Z0-9_])*[:;, ]$
私は、一言の文章だけでうまくいくように見えるものを思いついた。
アンカー^
を外すだけで準備完了$
です。
からの空の文字列と一致させたくない場合は、の代わりに"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})[:;, ]
トークンが文字列の最後にあり、特殊文字がなく、キャプチャしたい場合は、次のように変更することをお勧めします[:;, ]
。(?:[:;, ]|$)
^
文字列 (または複数行モードでは行) の先頭に$
一致し、最後に一致するため、それらを取り除く必要があります。
>>> 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;']
(もちろん、この最後の式だけでなく、前の式のいずれにも長さ制限を追加できます)。