如何匹配以、、或开头@
和结尾的单词?;
.
:
单词可以包含任何字母数字字符,并且可以包含下划线。
我想出了^@([a-zA-Z0-9_])*[:;, ]$
似乎仅适用于单个单词的句子。
只需卸下锚^
,$
您就可以开始了。
如果您不想匹配 中的空字符串"Example @ nothing"
,您可能需要指定“1 个或多个限定符”+
而不是*
. IE@([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']
它只捕获最后一个字母,因为限定符 (the *
) 在匹配捕获的括号之外。把它移进去,你会得到:
>>> 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;']
(当然,长度限制可以添加到前面的任何表达式中,而不仅仅是最后一个)。