【问题标题】:Python regex over multiple newlines多个换行符上的 Python 正则表达式
【发布时间】:2015-06-30 05:35:08
【问题描述】:

我有一个包含多个文件路径的字符串,其中一些包含路径中的任意换行符,我想使用 python 解析字符串,以便只保留文件名和扩展名。

例如:

a/b/c/d/file1.c  
a/b/c/d/e/f/g/h/1/2/3/4/5/foo.c  
dir1/dir2/newlinedir  
/nextlinedir/bar.c

应该被解析以给出输出:

file1.c
foo.c
bar.c

我正在使用以下正则表达式(文件名和扩展名的组必须分开以供以后使用):

path_regex = re.compile(r'.*\/([^\/\.]*)(\.c){0,1}$', re.MULTILINE)
path_regex.sub(r'\g<1>\g<2>', input_string)

这将适用于具有单行路径的字符串,但不适用于包含换行符的路径。 我该怎么办?

【问题讨论】:

  • 看这个:stackoverflow.com/questions/8384737/… >>>
  • 不幸的是,这不适用于包含换行符的路径。
  • string.replace("\n","") 应该可以解决问题。

标签: python regex newline


【解决方案1】:
^([\s\S]*?\/)(\w+\.c)

试试这个。查看演示。这也适用于multiline。使用mmultiline 标志。

https://regex101.com/r/rX1tE6/7

【讨论】:

    【解决方案2】:

    试试这个正则表达式:(?:.*\/)(.+)\.(.+)

    使用\1访问文件名,使用\2访问扩展名

    DEMO

    【讨论】:

    • 感谢您的回答,但我也需要删除 dir1/dir2/newlinedir,并将 bar.c 移至上一行。只有文件名和扩展名必须保留,其他没有。
    【解决方案3】:

    你可以试试这个,

    >>> s = '''a/b/c/d/file1.c  
    a/b/c/d/e/f/g/h/1/2/3/4/5/foo.c  
    dir1/dir2/newlinedir  
    /nextlinedir/bar.c'''
    >>> print(re.sub(r'(?s).*?([^/]+\.c)', r'\1\n', s))
    file1.c
    foo.c
    bar.c
    

    >>> print(re.sub(r'(?s).*?([^/]+)(\.[^.\n]+)(?=$|\n)', r'\1\2\n', s))
    file1.c  
    foo.c  
    bar.c
    

    【讨论】:

    • OP 说,文件名和扩展名的组必须分开以备后用
    【解决方案4】:

    这个简单的正则表达式也可以使用,您可以使用 \1 访问带有扩展名的文件名

    ([^/]*\.\w+)
    

    【讨论】:

      【解决方案5】:

      这在技术上不是您所要求的,但也许这里的正则表达式不是正确的工具,因为now you have two problems

      我认为这就是您要搜索的内容:

      pydoc os.path.basename
      

      所以试试这个:

      map(os.path.basename, text.split('\n'))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        相关资源
        最近更新 更多