使用正则表达式查找文本中所有有效的用户提及

时间:2019-06-20 13:59:59

标签: python regex

我需要在评论中找到所有用户提及。这意味着我需要找到正则表达式1)的所有匹配项,其中@之后不超过一个点和下划线。

这是可用于查找所有可能提及的正则表达式:

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

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

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

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

它检查用户名是否包含3-24个符号,是否包含0-1点和下划线。 由于negative lookahead

,用户名regex不适用于整个文本

我尝试结合使用正则表达式1)2),但是效果不佳。

Currently I stopped here

还可以使用正则表达式1),对于每个匹配项,都可以使用正则表达式2)。我不喜欢它,因为它在长评论中会非常缓慢...

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

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

我只需要提及用户名由3到24个符号组成且不超过一个点和下划线的提及

1 个答案:

答案 0 :(得分:1)

您可能会考虑使用像

这样的适当模式
let teamLogo = Team.get()
let teamImage = team?.teamLogo
guard let image = teamImage else {return nil}

let teamImageAttachment = AsyncTextAttachment()

teamImageAttachment.imageURL = URL(string: image)
let stringWithTeamImage = NSAttributedString(attachment: teamImageAttachment)
let finalAttributedString = NSMutableAttributedString(string: "")
finalAttributedString.append(stringWithTeamImage)

请参见regex demo。该模式的唯一缺点是,如果有效提及可以以r'\B@(?!(?:[a-z0-9.]*_){2})(?!(?:[a-z0-9_]*\.){2})[._a-z0-9]{3,24}\b' 结尾,它将与该.匹配(请参见demo)。

详细信息

  • .-一个\B@之前没有单词char
  • @-(?!(?:[a-z0-9.]*_){2})之后的任何地方都没有两个_字符
  • @-(?!(?:[a-z0-9_]*\.){2})之后的任何地方都没有两个.字符
  • @-三到二十四个字母,数字,[._a-z0-9]{3,24}.
  • _-单词边界

请注意,您实际上可以使用some Python code来过滤通过\b获得的结果:

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