正则字符串包含转义字符串

时间:2016-01-29 12:28:13

标签: 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

从我的两个文件名示例中可以看出,日期的位置是可变的。

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}}等等。

还有另一种方法可以找到我的约会对象吗?

6 个答案:

答案 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);
    ....
}

步骤是:

  1. 使用正则表达式分割
  2. 使用文件分隔符
  3. 再次拆分
  4. 从数组中取出最后一项
  5. 尝试/除外...因为肯定不是所有数据都匹配。

    此致