Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 包含转义字符的字符串上的正则表达式_Python_Regex - Fatal编程技术网

Python 包含转义字符的字符串上的正则表达式

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

我有一个传递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'
正则表达式将在处理原始字符串时工作,但是在我的实际程序中,传递的文件名不是原始格式,我找不到转换它的方法,即处理
\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
步骤如下:

  • 使用正则表达式拆分
  • 使用文件分隔符再次拆分
  • 从数组中获取最后一项
  • 尝试/除了。。。因为肯定不是所有的数据都匹配

    问候


    Tim

    Linux文件名应以正斜杠分隔。例如/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