Python 包含转义字符的字符串上的正则表达式
我有一个传递Linux文件名的函数,它是一个字符串,看起来像:Python 包含转义字符的字符串上的正则表达式,python,regex,Python,Regex,我有一个传递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 从我的两个文件名示例中可以看出,日期的位置是可变的 P
\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'
正则表达式将在处理原始字符串时工作,但是在我的实际程序中,传递的文件名不是原始格式,我找不到转换它的方法,即处理\2
等
还有其他方法可以找到我的日期吗?当您应用正则表达式时,字符串可能已经损坏。解决方案可能是在获取数据之前用双反斜杠替换反斜杠
但是,Linux文件名不应包含反斜杠,并且应使用正斜杠分隔(例如,
/home/test/2015-11-11/part2/part2a/part2b.png
)。如果您可以在收到数据之前将其转换为这种格式,那么您将被排序。无法100%确定问题出在哪里。。。您的正则表达式无法工作,因为(1)字符串中没有。
,(2)日期后的部分不仅仅是数字
如果将正则表达式设置为原始字符串,则可以使用\\
匹配字符串中的\
(或\\\\\
而不使用r
),并使用(.*)
确保只捕获下一段(非贪婪)
这个正则表达式应该可以工作:r'\d{4}-\d{2}-\d{2}\\\\(.*?\\”
>>> 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'…'
)只有在直接在源代码中输入该字符串时才有意义。如果是这种情况,只需在字符串中添加r
前缀即可。如果字符串来自其他地方、文件或UI中的文本字段,反斜杠将自动正确转义
另外,如前所述,Linux上的路径分隔符实际上应该是/
,而不是\
>>> lst2 = [s.replace('\\', '/') for s in lst]
>>> [re.search(r'\d{4}-\d{2}-\d{2}/(.*?)/', s).group(1) for s in lst2]
['part2', 'c', 'intereting']
这是怎么回事?只是在前面加上
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)
如果需要反斜杠,可以使用反斜杠(无论如何,它不能以一个反斜杠结束!)。但在Linux中,路径文件夹是用斜杠分隔的
例如:
re.compile(r'\this\is\a\path')
re.compile(r'\this\doesnt\work\')
如果需要字符串以反斜杠结尾,则应在所有位置使用双反斜杠
re.compile('\\this\\works\\now\\')
或者一个小把戏;)
使用/只是我的一个输入错误,而且由于示例文件名后面没有uxxxxx数据,使得正则表达式看起来是错误的,这使情况变得更糟 我的一位同事看了一眼,似乎认为这是因为我读琴弦的方式。一旦我将非常相似的代码应用到我的实际程序中,它就会在我的文件名中正确地找到日期字段,并正常工作
感谢所有人的快速响应,您只需要在日期之后输入文件名
import re
files=['/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']
for f2 in files:
try:
last_file=re.split('\d{4}[-]\d{2}[-]\d{2}/',f2)[1].split('/')[-1]
except ValueError:
last_file="Not Found"
print last_file,f2
这将产生
part2b.png /home/test/2015-11-11/part2/part2a/part2b.png
test4.bin /test1/test2/test3/test4/test5/2016-01-01/c/test3/test4.bin
part2.txt /opt/logging/bin64/spare/1905-12-12/intereting/file/location/part2.txt
步骤如下:
TimLinux文件名应以正斜杠分隔。例如/home/test/2015-11-11/part2/part2a/part2b.png您从哪里获得这些文件名?
import re
files=['/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']
for f2 in files:
try:
last_file=re.split('\d{4}[-]\d{2}[-]\d{2}/',f2)[1].split('/')[-1]
except ValueError:
last_file="Not Found"
print last_file,f2
part2b.png /home/test/2015-11-11/part2/part2a/part2b.png
test4.bin /test1/test2/test3/test4/test5/2016-01-01/c/test3/test4.bin
part2.txt /opt/logging/bin64/spare/1905-12-12/intereting/file/location/part2.txt