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+\]
看
详情:
-一个@
字符@
-一种积极的前瞻,匹配并捕获组1中的零个或多个单词、(?=([\w.@-]*\w))
、
和@
字符,尽可能多,然后立即在当前位置右侧添加一个单词字符(不使用文本,正则表达式引擎索引保持在同一位置)-
-组1中匹配和捕获的文本(这将使用使用先行模式捕获的文本,请注意,反向引用本质上是原子的)\1
-如果当前位置右侧有一个或多个数字+(?!\[\d+\])
,则会导致匹配失败的负前瞻]
.compile(r'@([\w.@-]*\w)\b(?!\[\d+\])
,添加单词边界。哇,太快了,谢谢!你能解释一下它的工作原理吗?如果你把它放在一个答案中,我也可以接受。遗憾的是,它不能正常工作:usernames=username\u regex.findall(“Hello@kev.\u in[1]”)
找到kev
,而它不应该找到任何东西。这是因为用户名可以不仅仅包含字母和数字。Kevin,我想补充一点,如果Pythonre
支持所有格量词或原子组,这个问题本来可以解决。不幸的是,情况并非如此。然后,您所需要的就是一个类似于@[\w.@-]*+\w(?!\[\d+])
的模式。看,没问题,完成了。