繁体   English   中英

如何使用正则表达式从路径中提取文件名

[英]How to extract filename from path using regex

我想使用正则表达式从路径中提取文件名:

mysting = '/content/drive/My Drive/data/happy (463).jpg'

我如何提取'happy.jpg'

我试过这个: '[^/]*$'但结果仍然包括括号中的数字,我不想要: 'happy (463).jpg'

我该如何改进它?

您可以使用 2 个捕获组。 在第一组匹配/并捕获组 1 中的 1+ 个单词字符。

然后匹配括号之间的 1+ 个数字并捕获.jpg断言第 2 组中字符串的结尾。

^.*/(\w+)\s*\(\d+\)(\.jpg)$

在将匹配的部分

  • ^.*/匹配到最后/
  • (\\w+) Catpure组 1 ,匹配 1+ 个单词字符
  • \\s*匹配 1+ 个空格字符
  • \\(\\d+\\)匹配括号之间的 1+ 个数字
  • (\\.jpg)捕获组 2 ,匹配.jpg
  • $字符串结尾

正则表达式演示| Python 演示

然后在替换中使用group 1和group 2得到happy.jpg

import re

regex = r"^.*/(\w+)\s*\(\d+\)(\.jpg)$"
test_str = "/content/drive/My Drive/data/happy (463).jpg"
result = re.sub(regex,  r"\1\2", test_str, 1)

if result:
    print (result)

输出

happy.jpg

没有正则表达式 str方法( str.partitionstr.rpartition ):

In [185]: filename = mysting.rpartition('/')[-1] 

In [186]: filename 
Out[186]: 'happy (463).jpg'

In [187]: f"{filename.partition(' ')[0]}.{filename.rpartition('.')[-1]}"
Out[187]: 'happy.jpg'

使用正则表达式 re.sub :

re.sub(r'.*/(?!.*/)([^\s]+)[^.]+(\..*)', r'\1\2', mysting)
  • .*/贪婪地匹配到最后一个/

  • 零宽度负前瞻(?!.*/)确保没有/在任何地方向前

  • ([^\\s]+)匹配到下一个空格并作为第一个捕获的组

  • [^.]+匹配到 next .

  • (\\..*)匹配一个文字. 后跟任意数量的字符并作为第二个捕获组; 如果您想更保守地匹配 3 个字符甚至文字.jpg您也可以这样做

  • 在替换中,仅使用捕获的组

例子:

In [183]: mysting = '/content/drive/My Drive/data/happy (463).jpg'

In [184]: re.sub(r'.*/(?!.*/)([^\s]+)[^.]+(\..*)', r'\1\2', mysting)
Out[184]: 'happy.jpg'

我使用javascript。

在 javascript 的情况下,

 const myString="happy (463).jpg"; const result=myString.replace(/\\s\\(\\d*\\)/,'');

在斜杠分隔符中拆分路径后,您可以应用此代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM