1

如何匹配以、、或开头@和结尾的单词?;.: 

单词可以包含任何字母数字字符,并且可以包含下划线。

我想出了^@([a-zA-Z0-9_])*[:;, ]$似乎仅适用于单个单词的句子。

4

2 回答 2

4

只需卸下锚^$您就可以开始了。

如果您不想匹配 中的空字符串"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})[:;, ]

如果令牌位于字符串的末尾并且没有特殊字符,并且您想要捕获它,您可能需要修改[:;, ](?:[:;, ]|$)

于 2012-06-11T10:31:43.180 回答
3

^匹配字符串的开头(或行,在多行模式下),而$匹配结尾,因此您需要摆脱它们:

>>> 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;']

(当然,长度限制可以添加到前面的任何表达式中,而不仅仅是最后一个)。

于 2012-06-11T10:37:20.233 回答