【发布时间】:2025-12-09 02:30:01
【问题描述】:
考虑以下(高度简化的)字符串:
'a b a b c a b c a b c'
这是'a b c' 的重复模式,除了开头缺少'c'。
我寻求一个正则表达式,它可以通过使用re.findall() 为我提供以下匹配项:
[('a', 'b'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]
因此,上面的字符串有 4 个 'a b c' 匹配 - 尽管第一个匹配是一个特殊情况,因为 'c' 丢失了。
我最简单的尝试是尝试捕获'a' 和'b' 并为'c' 使用可选捕获:
re.findall(r'(a).*?(b).*?(c)?', 'a b a b c a b c a b c')
我明白了:
[('a', 'b', ''), ('a', 'b', ''), ('a', 'b', ''), ('a', 'b', '')]
显然,它只是忽略了c。当对'c' 使用非可选捕获时,搜索会提前跳过并在第二个'a b c' 子字符串中错过'a' 和'b'。这会导致 3 个错误匹配:
[('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]
我尝试了其他几种技术(例如,'(?<=c)'),但均无济于事。
注意:上面的字符串只是我的“真实世界”问题的一个骨架示例,其中上面的三个字母本身就是字符串(来自一个长日志文件),在我需要从中提取命名的其他字符串和换行符之间组。
我在 Windows 7 上使用 Python 3.5.2。
【问题讨论】:
-
您需要在
re.findall完成工作后“手动”删除空元组元素。 -
您确定需要正则表达式来解析您的日志吗?
-
@WayneWerner 是的 :) 绝对必要。
-
您的示例非常简单,因此很难提供可靠的答案。我相信问题在于您在 a、b 和 c 之间使用了
.*?通配符。对于初学者,请尝试使用.+?代替,以便惰性运算符不会导致它匹配零个字符并重新开始模式。 -
此正则表达式格式适用于 R
^ab|abc示例:x = "ababcabcabc"stringr::str_extract_all(x,"^ab|abc")[1] "ab" "abc" "abc" "abc"不确定在 python 中是如何实现的。
标签: regex string python-3.x