我有一个传递Linux文件名的函数,作为字符串,看起来像:
\home\test\2015-11-11\part2\part2a\part2b.png or
\test1\test2\test3\test4\test5\2016-01-01\c\test3\test4.bin or
\opt\logging\bin64\spare\1905-12-12\intereting\file\location\part2.txt
从我的两个文件名示例中可以看出,日期的位置是可变的。
Python版本是2.7
我只对日期字段后面的字符串部分感兴趣。我的想法是使用正则表达式找到类似
的位置re.search( "\d{4}-\d{2}-\d{2}_\d{5}", file_in ).end()
然而,字符串中出现\ 2会导致正则表达式失败。
在独立测试中,如果我
filename = r'\home\test\2015-11-11\part2\part2a\part2b'
正则表达式将工作,因为它正在处理原始字符串,但是在我的真实程序中,传递的文件名不是原始格式,我找不到转换它的方法,这是有效的,即应对{{ 1}}等等。
还有另一种方法可以找到我的约会对象吗?
答案 0 :(得分:1)
不是100%确定问题是什么...你的正则表达式无法正常工作,因为(1)字符串中没有_
,(2)日期之后的部分不是只是数字。
如果您将正则表达式设为原始字符串,则可以使用\\
来匹配字符串中的\
(或\\\\
不r
)和{{1}确保只捕获下一个段(非贪婪)。
此正则表达式应该有效:(.*?)
r'\d{4}-\d{2}-\d{2}\\(.*?)\\'
请注意" raw" string(>>> lst
['\\home\\test\\2015-11-11\\part2\\part2a\\part2b.png',
'\\test1\\test2\\test3\\test4\\test5\\2016-01-01\\c\\test3\\test4.bin',
'\\opt\\logging\\bin64\\spare\\1905-12-12\\intereting\\file\\location\\part2.txt']
>>> [re.search(r'\d{4}-\d{2}-\d{2}\\(.*?)\\', s).group(1) for s in lst]
['part2', 'c', 'intereting']
)仅在直接在源代码中输入字符串时才有意义。如果是这种情况,只需在字符串中添加r'...'
前缀即可。如果字符串来自某个其他位置,来自文件或UI中的文本字段,则会自动正确转义反斜杠。
另外,如前所述,Linux上的路径分隔符实际上应该是r
,而不是/
。
\
答案 1 :(得分:0)
当你应用你的正则表达式时,字符串可能已经被破坏了。解决方案可能是在获取数据之前用双反斜杠替换反斜杠。
但是,Linux文件名不应包含反斜杠,而应该是正斜杠(例如/home/test/2015-11-11/part2/part2a/part2b.png
)。如果您可以在收到数据之前将它们转换为此格式,那么您将被排序。
答案 2 :(得分:0)
这仅仅是在str.split(regex).forEach(function(str) {
var match = str.match(regex);
if (!match) {
// between matches
}
});
-
r
输出 -
import re
data = [r'\home\test\2015-11-11\part2\part2a\part2b.png',
r'\test1\test2\test3\test4\test5\2016-01-01\c\test3\test4.bin',
r'\opt\logging\bin64\spare\1905-12-12\intereting\file\location\part2.txt']
def date_finder(s):
return re.findall(r'(?<=(?<=\\)(?:\d{4}-\d{2}-\d{2})(?=\\))(.*)',i)
for i in data:
print date_finder(i)
答案 3 :(得分:0)
如果你需要反斜杠,你可以使用raw string(无论如何,它不能以一个反斜杠结束!)。但在Linux中,路径文件夹由正斜杠分隔
示例:
['\\part2\\part2a\\part2b.png']
['\\c\\test3\\test4.bin']
['\\intereting\\file\\location\\part2.txt']
如果您需要以反斜杠结束字符串,则应在所有地方使用双反斜杠
re.compile(r'\this\is\a\path')
re.compile(r'\this\doesnt\work\')
或者一个小技巧;)
re.compile('\\this\\works\\now\\')
答案 4 :(得分:0)
使用/只是我的一个错字,并且由于后面没有_xxxxx数据的示例文件名变得更糟,使正则表达式看起来不对。
我的一位同事看了一眼,似乎认为这与我读弦的方式有关。一旦我将非常相似的代码应用到我的真实程序,它就会在我的文件名中正确找到日期字段并起作用。
感谢所有人的快速回复
答案 5 :(得分:0)
如您所指定,您只需要在日期之后的文件名....
python3 -i binarytree.py
哪个会产生
的输出private void setRewardedVideo() {
if (!isNetworkAvailable()) {
// Log no internet
return;
}
rewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this);
rewardedVideoAd.setUserId(REWARD);
....
}
步骤是:
尝试/除外...因为肯定不是所有数据都匹配。
此致
添