我正在编写一个代码,以检查Git Repo并找出上次(最近一次)提交后更改了哪些文件。这些是.sql文件。我得到的输出为Follows
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'
现在,我陷入了正则表达式中,无法从字符串中提取文件名。我可以使用多次拆分来提取这些文件名,但这将是不好的,并且会不必要地使我的代码复杂化。因此,我想使用re.findall
,因为它会提供一系列我必须处理的文件名。
此处,预期输出为
['123.sql','abc.sql','xyz.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\tabc.sqlt\n:000000 100644 0000000... e69de29... A\ttestFile1\n:000000 100644 0000000... e69de29... A\txyz.sql\n'
regex =“需要帮助”
files = re.findall(regex, files.decode('utf-8'))
答案 0 :(得分:1)
您可以匹配一个或多个单词char,后跟.
和sql
子字符串,但是由于files
是字节字符串,因此您还应该在字符串文字前加上{{1 }}:
b
详细信息
re.findall(rb'\w+\.sql', files)
^ ^^^^^^^^
-1个或多个字母,数字,\w+
字符_
-一个点\.
-一个sql
子字符串。请参见Python demo:
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\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))
答案 1 :(得分:0)
为什么不只在以.sql
结尾并由制表符分隔的行的末尾查找所有“单词”?
re = re.compile(r'\t(\w+\.sql)$')
如果您的“ SQL文件名”包含空格或其他怪异的东西,则必须分析完整的行,但是似乎像上面的我这样的更简单的方法应该很容易理解,并且可以使您达到大多数。 / p>
答案 2 :(得分:0)
此代码将为您提供帮助吗?
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']