python - 为什么我的 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
. 如何调整它以使整个部分匹配?或者更好的是,只是没有斜线的部分?
我尝试过的其他事情:
- 正则表达式中的远程转义字符:
r"(?<!\)(\\\)*(?!\)\$[a-zA-Z_]\w*"
这会导致错误re.error: missing ), unterminated subpattern at position 11
解决方案
你捕捉到了错误的东西。像这样制作(\\\\)
一个非捕获组:(?:\\\\)
并像这样捕获斜线之后的部分:(\$[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')]
推荐阅读
- sql - 将包含空单元格、NULL 和字符串的列投射到 BigQuery 中的 FLOAT64
- flutter - 颤振:sku_details_wrapper.g.dart 中的投射错误
- python - Discord.py 正确的队列系统
- c# - 在 SQL 查询中使用变量
- python - Pandas:如果“Action”一词在“Dialouge”一词之前,则填写Action的时间线,与Dialouge相同
- python - 有没有办法可以使用像 pydub 这样的音频 api 和 discord.py?
- javascript - 如何在node.js中的某些数字后显示分页点并做出反应
- python - 线的形状与来自线性回归的信息不同?
- google-chrome-extension - Chrome 扩展从 onInstall 在 backgroundjs 中发送消息到自己的扩展 javascript 代码
- xcode - 文档中的 AppCode 链接导航到代码库中的另一个类型/成员