Regex PYTHON正则表达式从字符串中搜索所有.sql文件名

Regex PYTHON正则表达式从字符串中搜索所有.sql文件名,regex,python-3.x,Regex,Python 3.x,我正在编写一段代码,检查Git Repo并找出在最近一次提交后更改了哪些文件。这些是.sql文件。我得到如下输出 b'commit 7cc9c8ac247f2c139c37081aef091b78c6d51011\nAuthor: blahblah <blahblah@gmail.com>\nDate: Wed Oct 17 18:46:37 2018 +0800\n\n test subprocess output\n\n:000000 100644 0000000...

我正在编写一段代码,检查Git Repo并找出在最近一次提交后更改了哪些文件。这些是.sql文件。我得到如下输出

b'commit 7cc9c8ac247f2c139c37081aef091b78c6d51011\nAuthor: blahblah <blahblah@gmail.com>\nDate:   Wed Oct 17 18:46:37 2018 +0800\n\n    test subprocess output\n\n:000000 100644 0000000... e69de29... A\t123.sql\n:000000 100644 0000000... 617f0a5... A\tabc.sql\n:000000 100644 0000000... e69de29... A\ttestFile1\n:000000 100644 0000000... e69de29... A\txyz.sql\n' 
需要有关正则表达式模式的帮助

示例代码示例:

import re
files = b'commit 7cc9c8ac247f2c139c37081aef091b78c6d51011\nAuthor: blahblah <blahblah@gmail.com>\nDate:   Wed Oct 17 18:46:37 2018 +0800\n\n    test subprocess output\n\n:000000 100644 0000000... e69de29... A\t123.sql\n:000000 100644 0000000... 617f0a5... A\tabc.sqlt\n:000000 100644 0000000... e69de29... A\ttestFile1\n:000000 100644 0000000... e69de29... A\txyz.sql\n'

为什么不在以.sql结尾并由制表符分隔的行末尾查找所有单词

re = re.compile(r'\t(\w+\.sql)$')

如果您的SQL文件名包含空格或其他奇怪的内容,您将不得不解析完整的行,但似乎像我上面所说的更简单的方法应该很容易理解,并且在大多数情况下都能让您理解。

这段代码会帮到您吗

import re
files = "b'commit 7cc9c8ac247f2c139c37081aef091b78c6d51011\nAuthor: blahblah <blahblah@gmail.com>\nDate:   Wed Oct 17 18:46:37 2018 +0800\n\n    test subprocess output\n\n:000000 100644 0000000... e69de29... A\t123.sql\n:000000 100644 0000000... 617f0a5... A\abc.sqlt\n:000000 100644 0000000... e69de29... A\ttestFile1\n:000000 100644 0000000... e69de29... A\txyz.sql\n'"

regex=r"(\w+.sql)"

result = re.findall(regex, str(files), re.M)

print(result)

您可以将一个或多个单词字符后跟一个。和sql子字符串,但由于文件是字节字符串,因此还应在字符串文本前加上b:

细节

\w+-1个或多个字母、数字、字符 \-一个点 sql-一个sql子字符串。 见:


请尝试re.findallrb'\w+\.sql'文件。我没有发布,因为您的预期结果与您的输入不同步。您的字符串不包含abc.sql,有\a,一个贝尔字符的转义序列。感谢您提醒我注意这一点,刚刚编辑了字符串OK,那么,我的解决方案有效吗?我应该发布或者做下面的答案对你来说足够好吗?我不确定文件是否是字节字符串。它是?在我看来,您的第二个代码段仍然损坏,因为b'在字符串文字中,而在顶部,它不是。是的,您的答案有效,并且文件是一个字节字符串,作为子流程的输出。检查\u输出。在进行操作之前,我将其转换为字符串
re = re.compile(r'\t(\w+\.sql)$')
import re
files = "b'commit 7cc9c8ac247f2c139c37081aef091b78c6d51011\nAuthor: blahblah <blahblah@gmail.com>\nDate:   Wed Oct 17 18:46:37 2018 +0800\n\n    test subprocess output\n\n:000000 100644 0000000... e69de29... A\t123.sql\n:000000 100644 0000000... 617f0a5... A\abc.sqlt\n:000000 100644 0000000... e69de29... A\ttestFile1\n:000000 100644 0000000... e69de29... A\txyz.sql\n'"

regex=r"(\w+.sql)"

result = re.findall(regex, str(files), re.M)

print(result)
['123.sql', 'bc.sql', 'xyz.sql']
re.findall(rb'\w+\.sql', files) 
            ^ ^^^^^^^^
import re
files = b'commit 7cc9c8ac247f2c139c37081aef091b78c6d51011\nAuthor: blahblah <blahblah@gmail.com>\nDate:   Wed Oct 17 18:46:37 2018 +0800\n\n    test subprocess output\n\n:000000 100644 0000000... e69de29... A\t123.sql\n:000000 100644 0000000... 617f0a5... A\tabc.sqlt\n:000000 100644 0000000... e69de29... A\ttestFile1\n:000000 100644 0000000... e69de29... A\txyz.sql\n'
print(re.findall(rb'\w+\.sql', files))
[b'123.sql', b'abc.sql', b'xyz.sql']