首页 > 解决方案 > 为什么我的 Python REGEX findall 返回意外的匹配列表?

问题描述

我正在尝试检测以下模式:偶数个\后跟$和文本。

这是有效的:\\$hello$goodbye

我正在尝试在 Python 中执行此操作:

txt = r"\\$hello"
regex = r"(?<!\\)(\\\\)*(?!\\)\$[a-zA-Z_]\w*"

x = re.findall(regex, txt)

if x:
  print(x)
else:
  print("No match")

当我运行它时,我得到这个输出['\\\\'],即使我在这里尝试它:https://regex101.com/,我得到一个完全匹配的\\$hello. 如何调整它以使整个部分匹配?或者更好的是,只是没有斜线的部分?

我尝试过的其他事情:

  1. 正则表达式中的远程转义字符:r"(?<!\)(\\\)*(?!\)\$[a-zA-Z_]\w*"这会导致错误re.error: missing ), unterminated subpattern at position 11

标签: pythonregex

解决方案


你捕捉到了错误的东西。像这样制作(\\\\)一个非捕获组:(?:\\\\)并像这样捕获斜线之后的部分:(\$[a-zA-Z_]\w*)。然后你的代码给出x = ['$hello']

txt = r"\\$hello"
regex = r"(?<!\\)(?:\\\\)*(?!\\)(\$[a-zA-Z_]\w*)"

x = re.findall(regex, txt)
# x:  ['$hello']

如果要捕获斜线和其余部分,请保留原始捕获组,但添加第二个。

txt = r"\\$hello"
regex = r"(?<!\\)(\\\\)*(?!\\)(\$[a-zA-Z_]\w*)"

x = re.findall(regex, txt)
# x: [('\\\\', '$hello')]

推荐阅读