如何通过python的re模块从字符串末尾删除最短匹配的模式?

时间:2017-08-18 02:05:46

标签: python bash

我正在将我的bash代码转换为python代码。

现在我想在bash中创建一个具有$ {variable%pattern}功能的函数;从字符串末尾删除最短匹配的模式,

例如,我希望delete_tail('_ usr_home_you_file.ext.tar.oz',r'。')会产生'_usr_home_you_file.ext.tar'

我在下面创建了python函数,

import re

def delete_tail(word,pattern):
    return re.sub('{0}.*?$'.format(pattern), '', word)

然而,它会删除最长匹配的模式,如下所示。

word='_usr_home_you_file.ext.tar.oz'
delete_shortest_match_tail=delete_tail(word,r'\.')
print("word = {0}".format(word))
print("delete_shortest_match_tail = {0}". format(delete_shortest_match_tail))

输出:

delete_shortest_match_tail = _usr_home_you_file

如何按照我的预期制作一个从字符串末尾删除最短匹配模式的函数?

非常感谢。

1 个答案:

答案 0 :(得分:1)

您更愿意在模式前面搜索字符串,而不是替换模式。正则表达式始终从左到右查看,所有匹配都按此顺序报告。我们不能简单地反转字符串,因为这会搞乱RegEx模式。因此,我们无法使用sub,但是使用空字符串替换某些内容与删除相同,或者获取字符串的其余部分。这基本上就是这个解决方案的作用。它会搜索您的结果,只是省略您不想要的部分。

def removeFromEnd(pattern, target):
  m = re.match("(.*)" + pattern + ".*$", target)
  if m:
    return m.group(0)
  else:
    return target
  

>>> removeFromEnd(“\。”,“foo.tar.gz”)

     

'foo.tar'

相关问题