使用regex在文本中查找所有有效的用户提及

2024-06-11 16:50:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要找到所有用户提到的评论。这意味着我需要找到正则表达式1)的所有匹配项,其中@后面只有一个点和下划线。你知道吗

这里有一个regex,可以用来查找所有可能的提及:

1)\B(@[a-z_.]{3,24})

我想确保@之后的符号是有效的用户名(不需要检查数据库中是否存在用户)

我正在使用此正则表达式验证用户名:

2)'^(?!(.*?\_){2})(?!(.*?\.){2})[a-z0-9\._]{3,24}$'

它检查用户名是否由3-24个符号组成,是否包含0-1个点和下划线。 用户名regex将不适用于整个文本,因为negative lookahead

我尝试将regex 1)2)结合起来,但效果不好。你知道吗

Currently I stopped here

也可以使用regex 1),对于每个匹配使用regex 2)。我不喜欢它,因为它会工作很慢,对长的评论。。。你知道吗

更新: 例如,我有一个评论

'text @valid_username text @unvalid_username_ text @valid.username text @unvalid..username'

我只需要提到用户名由3-24个符号组成,并且不包含超过一个点和下划线


Tags: text用户文本数据库评论符号username用户名
1条回答
网友
1楼 · 发布于 2024-06-11 16:50:01

你可以考虑一个足够好的模式,比如

r'\B@(?!(?:[a-z0-9.]*_){2})(?!(?:[a-z0-9_]*\.){2})[._a-z0-9]{3,24}\b'

参见regex demo。该模式的唯一缺点是,如果有效的提及可以以.结尾,那么它将与.匹配(参见demo)。你知道吗

细节

  • \B@-a@前面没有字符
  • (?!(?:[a-z0-9.]*_){2})-在@之后没有两个_字符
  • (?!(?:[a-z0-9_]*\.){2})-在@之后没有两个.字符
  • [._a-z0-9]{3,24}-三到二十四个字母、数字、._
  • \b-单词边界

注意:您实际上可以使用some Python code来过滤通过\B(@[a-z_.]{3,24})获得的结果:

import re
s = 'text @valid_username text @unvalid_username_ text @valid.username text @unvalid..username  @validusername.'
print([x for x in re.findall(r'\B@[._a-z0-9]{3,24}', s) if x.count('.') < 2 and x.count('_') < 2 ])
# => ['@valid_username', '@valid.username', '@validusername.']

相关问题 更多 >