Python 若模式后面跟着另一个模式,则正则表达式应该失败

Python 若模式后面跟着另一个模式,则正则表达式应该失败,python,regex,Python,Regex,我需要检测消息中提到的@username,但如果是以@username[user\u id]的形式出现,则不需要检测。我有一个正则表达式可以匹配@username部分,但是如果后面跟\[\d\],我很难否定匹配 重新导入 用户名\u regex=re.compile(r'@([\w.@-]+[\w])) usernames=username_regex.findall(“Hello@kevin”)#正确找到kevin usernames=username_regex.findall(“Hello

我需要检测消息中提到的
@username
,但如果是以
@username[user\u id]
的形式出现,则不需要检测。我有一个正则表达式可以匹配
@username
部分,但是如果后面跟
\[\d\]
,我很难否定匹配

重新导入
用户名\u regex=re.compile(r'@([\w.@-]+[\w]))
usernames=username_regex.findall(“Hello@kevin”)#正确找到kevin
usernames=username_regex.findall(“Hello@kevin”)#正确地找到了kevin
usernames=username_regex.findall(“Hello@kevin[1]”)不应该找到kevin,但是找到了
正则表达式允许用户名包含
@
-
,但需要以
\w
字符(
[a-zA-Z0-9)
)结尾。如果在
[1]
表单中用户名后跟userid,如何扩展regex以使其失败

我尝试了
@([\w.@-]+[\w])(?!\[\d+\])
,但它匹配
kevi
您可以“模拟”所有格匹配

@(?=([\w.@-]*\w))\1(?!\[\d+\]

详情:

  • @
    -一个
    @
    字符
  • (?=([\w.@-]*\w))
    -一种积极的前瞻,匹配并捕获组1中的零个或多个单词、
    @
    -
    字符,尽可能多,然后立即在当前位置右侧添加一个单词字符(不使用文本,正则表达式引擎索引保持在同一位置)
  • \1
    -组1中匹配和捕获的文本(这将使用使用先行模式捕获的文本,请注意,反向引用本质上是原子的)
  • (?!\[\d+\])
    -如果当前位置右侧有一个或多个数字+
    ]
    ,则会导致匹配失败的负前瞻

.compile(r'@([\w.@-]*\w)\b(?!\[\d+\])
,添加单词边界。哇,太快了,谢谢!你能解释一下它的工作原理吗?如果你把它放在一个答案中,我也可以接受。遗憾的是,它不能正常工作:
usernames=username\u regex.findall(“Hello@kev.\u in[1]”)
找到
kev
,而它不应该找到任何东西。这是因为用户名可以不仅仅包含字母和数字。Kevin,我想补充一点,如果Python
re
支持所有格量词或原子组,这个问题本来可以解决。不幸的是,情况并非如此。然后,您所需要的就是一个类似于
@[\w.@-]*+\w(?!\[\d+])
的模式。看,没问题,完成了。