Python 正则表达式,仅显示彩色线(来自git diff输出)
我有一个字符串Python 正则表达式,仅显示彩色线(来自git diff输出),python,regex,git,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/
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);
}
import re
for chunk in re.findall(r'((?:[^\n]*\x1b\[32m[^\n]*\n)+)', x):
print chunk
及
git diff的原始输出如下(您还可以看到颜色代码):
我发现一个正则表达式实际上可以匹配绿色,但我在将其应用于具体问题时遇到了问题:
/^\e\[32m\+\e\[m\e\[32m(.*)\e\[m$/
您只需测试序列是否在以下行中:
for line in x.split('\n'):
if '\x1b[32m' in line:
print line
如果您真的需要查找所有包含绿色esc序列的线组,您可以这样做:
@TestMetadata("chainedCall.kt")
public void testChainedCall() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/chainedCall.kt");
doTest(fileName);
}
import re
for chunk in re.findall(r'((?:[^\n]*\x1b\[32m[^\n]*\n)+)', x):
print chunk
但我认为搜索转义序列是一种黑客行为。git
根据正在使用的终端决定如何制作绿色的东西等。如果你去另一个终端,你可能会得到不同的转义序列。此外,git
可能会决定不打印彩色代码,以防它注意到它的输出不可用一种终端,但与另一进程或文件连接
不过,我没有找到简单的替代方法,没有调整
git
以特殊格式或类似格式打印添加的行。因此,唯一真正干净的方法是完全解析git
输出(就像patch
可以)也就是说,把它所说的行数考虑进去,而忽略了格式化。但是,仅仅用模式匹配是不可能的。你是否考虑过用“代码> +/CODE >开始的行?”一点是,当处理UNIX命令的ASCII输出时,颜色会被抑制;它们只在屏幕上有意义。Grams在注意到其输出被传递到另一个命令时立即停止生成颜色代码。链接问题中公认的答案是颜色代码,因为前面可能有其他带有加号的行。此外,我正在使用GitPython使用Python,因此没有可用的grep。我不是指Unix命令grep
,我指的是grepping(获取与正则表达式匹配的内容)。请允许我注意,可以使用参数--color=always
强制git输出颜色代码。但是没有记录git将使用哪些颜色代码git
。这可能取决于当前的终端。但是,Linux上的版本2.7.4似乎是不可知的,并且无论终端如何,都始终使用相同的颜色代码。我不会这样做I don’我敢打赌,更高版本或Windows版本(或更为bizarr的版本)总是会这样做。颜色代码只是不需要搜索的东西。然而,这样做是一种黑客行为。