RegEx,只显示彩色线条(来自git diff输出)

时间:2017-06-02 09:18:40

标签: python regex git

我有一个字符串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$/

1 个答案:

答案 0 :(得分:1)

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

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

如果你真的需要找到所有包含green-esc序列的行组,你可以这样做:

import re

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

但我认为搜索转义序列是一个黑客攻击。 git确定在使用终端的基础上如何制作绿色等。如果你去另一个终端,你可能会得到不同的转义序列。此外,git可能决定不打印颜色代码,以防它注意到它的输出不是去往终端而是去另一个进程或文件。

我发现没有简单的替代方法,没有调整git来打印出特殊格式或类似格式的添加行。所以唯一真正干净的方法就是完全解析git输出(就像patch那样),i。即将它所说的行号记下来并忽略格式。但仅靠模式匹配是不可能的。