首页 > 解决方案 > 如何捕获带有符号前缀的模式?

问题描述

我正在使用 Python 中的正则表达式,并且在捕获某些模式时遇到了一些问题。

我需要捕获每个带有 '%' 前缀的标记,它可以以不同的方式出现,但我只需要收集以下标记:

case 1: %Y
case 2: -p %U %y %y %p asd%a%a 
case 3: -p 8080 %M %a %x %y some_variable another_one %_capture_this %and_this %this%no neither%this %e

所以如果我使用re.findall我应该得到:

output 1: ['%Y']
output 2: ['%U','%y','%y','%p']
output 3: ['%M','%a','%x','%y','%_capture_this','%and_this','%e']

我试过:

regex = r'(\%\w+)|(?:\%\w+\%\w+)|(?:\w+\%\w+)'

但它正在捕获asd%a%a%this%not在两个组中(Demo)。

我需要排除两者,我该如何修复这个正则表达式?

提前致谢。

标签: pythonregex

解决方案


您可以使用

re.findall(r'\B%\w+\b(?!%)', text)

查看正则表达式演示

正则表达式详细信息

  • \B- 一个非单词边界,要求下一个%不能在它之前有一个单词 char
  • %- 一个%字符
  • \w+- 1+字字符(字母/数字/下划线)
  • \b- 一个单词边界,最后一个匹配的char\w+后面不能跟一个单词char(必须使用它,因为后面有一个否定的lookahead\w+以避免回溯)
  • (?!%)- 紧靠右边,必须没有%字符。

推荐阅读