gpt4 book ai didi

python - 正则表达式,仅显示彩色线条(来自 git diff 输出)

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:42 24 4
gpt4 key购买 nike

我有一个看起来像这样的字符串x。前面带加号的行采用颜色编码。

diff --git js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java
index 55597bf..9115830 100644
--- js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java
+++ js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java
@@ -38,0 +39,6 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest {
+ @TestMetadata("chainedCall.kt")
+ public void testChainedCall() throws Exception {
+ String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/chainedCall.kt");
+ doTest(fileName);
+ }
+
@@ -92,0 +99,6 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest {
+ @TestMetadata("longLiteral.kt")
+ public void testLongLiteral() throws Exception {
+ String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/longLiteral.kt");
+ doTest(fileName);
+ }
+

我想提取绿线,这样最后我就有两个字符串(字符串数组),如下所示:

    @TestMetadata("chainedCall.kt")
public void testChainedCall() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/chainedCall.kt");
doTest(fileName);
}

    @TestMetadata("longLiteral.kt")
public void testLongLiteral() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/longLiteral.kt");
doTest(fileName);
}

git diff 的原始输出是这样的(您还可以在其中看到颜色代码):

'\x1b[1mdiff --git js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java\x1b[m\n\x1b[1mindex 55597bf..9115830 100644\x1b[m\n\x1b[1m--- js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java\x1b[m\n\x1b[1m+++ js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java\x1b[m\n\x1b[36m@@ -38,0 +39,6 @@\x1b[m \x1b[mpublic class JsLineNumberTestGenerated extends AbstractJsLineNumberTest {\x1b[m\n\x1b[32m+\x1b[m\x1b[32m    @TestMetadata("chainedCall.kt")\x1b[m\n\x1b[32m+\x1b[m\x1b[32m    public void testChainedCall() throws Exception {\x1b[m\n\x1b[32m+\x1b[m\x1b[32m        String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/chainedCall.kt");\x1b[m\n\x1b[32m+\x1b[m\x1b[32m        doTest(fileName);\x1b[m\n\x1b[32m+\x1b[m\x1b[32m    }\x1b[m\n\x1b[32m+\x1b[m\n\x1b[36m@@ -92,0 +99,6 @@\x1b[m \x1b[mpublic class JsLineNumberTestGenerated extends AbstractJsLineNumberTest {\x1b[m\n\x1b[32m+\x1b[m\x1b[32m    @TestMetadata("longLiteral.kt")\x1b[m\n\x1b[32m+\x1b[m\x1b[32m    public void testLongLiteral() throws Exception {\x1b[m\n\x1b[32m+\x1b[m\x1b[32m        String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/longLiteral.kt");\x1b[m\n\x1b[32m+\x1b[m\x1b[32m        doTest(fileName);\x1b[m\n\x1b[32m+\x1b[m\x1b[32m    }\x1b[m\n\x1b[32m+\x1b[m'

There我找到了一个实际上可以匹配绿色的正则表达式,但我在将其应用于我的具体问题时遇到了问题:

/^\e\[32m\+\e\[m\e\[32m(.*)\e\[m$/

最佳答案

您可以测试序列是否在行中:

for line in x.split('\n'):
if '\x1b[32m' in line:
print line

如果您确实需要查找全部包含 green-esc-sequence 的行组,您可以这样做:

import re

for chunk in re.findall(r'((?:[^\n]*\x1b\[32m[^\n]*\n)+)', x):
print chunk

但我认为搜索转义序列是一种黑客行为。 git 根据所使用的终端确定如何使某些内容变为绿色等。如果您转到不同的终端,您可能会得到不同的转义序列。此外,git 可能会决定不打印颜色代码,以防它发现其输出不是发送到终端而是发送到另一个进程或文件。

不过,我没有找到简单的替代方案,没有调整 git 以特殊格式或类似格式打印添加的行。因此,唯一真正干净的方法是完全解析 git 输出(就像 patch 所做的那样),即。 e.考虑它所说的行号并忽略格式。但这仅靠模式匹配是不可能的。

关于python - 正则表达式,仅显示彩色线条(来自 git diff 输出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44325215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com