簡體   English   中英

如果模式后面跟着另一個模式,正則表達式應該會失敗

[英]Regex should fail if pattern is followed by another pattern

我需要檢測消息中提到的@username ,但如果它是@username[user_id]的形式則不需要。 我有一個可以匹配@username部分的正則表達式,但如果它后面跟着\[\d\] ,我很難否定匹配。

import re

username_regex = re.compile(r'@([\w.@-]+[\w])')

usernames = username_regex.findall("Hello @kevin") # correctly finds kevin
usernames = username_regex.findall("Hello @kevin.") # correctly finds kevin
usernames = username_regex.findall("Hello @kevin[1].") # shouldn't find kevin but does

正則表達式允許包含@ , 的用戶名. - ,但需要以\w字符( [a-zA-Z0-9_] )結尾。 如果用戶名后跟[1]表單中的用戶 ID,我如何擴展正則表達式以使其失敗?

我試過@([\w.@-]+[\w])(?!\[\d+\])但它匹配kevi

我正在使用 Python 3.10。

您可以“模擬”所有格匹配

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

請參閱正則表達式演示

詳情

  • @ - 一個@字符
  • (?=([\w.@-]*\w)) - 匹配並捕獲到第 1 組零個或多個單詞的正向前瞻, . , @-字符,盡可能多,然后在當前 position 右側緊接一個單詞 char(文本不被消耗,正則表達式引擎索引保持在同一位置)
  • \1 - 在第 1 組中匹配和捕獲的文本(這會消耗使用前瞻模式捕獲的文本,請注意反向引用本質上是原子的)
  • (?!\[\d+\]) - 如果當前位置右側有[ + 一位或多位數字 + ]則匹配失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM