【问题标题】:Find and remove a string starting and ending with a specific substring in python在python中查找并删除以特定子字符串开头和结尾的字符串
【发布时间】:2015-11-08 00:32:03
【问题描述】:

我有一个类似于"dasdasdsafs[image : image name : image]vvfd gvdfvg dfvgd" 的字符串。从这个字符串中,我想删除从 [image : 开始并以 : image] 结尾的部分。我尝试使用以下代码查找“子字符串”-

result = re.search('%s(.*)%s' % (start, end), st).group(1)

但它没有给我所需的结果。 帮助我找到从字符串中删除子字符串的正确方法。

【问题讨论】:

标签: python regex python-2.7 python-3.x


【解决方案1】:

您可能只需要转义方括号,因为它们是正则表达式中的特殊字符(即 start = r"\[image :" and end = r": image\]")。

【讨论】:

  • 你能举一个完整的例子吗?我尝试了这个result = re.search('%s(.*)%s' %(start, end),st).group(1),它返回了我从开始到结束之间的字符串。但我需要从头到尾删除。
【解决方案2】:

你可以使用re.sub

>>> s='dasdasdsafs[image : image name : image]vvfd gvdfvg dfvgd'
>>> re.sub(r'\[image.+image\]','',s)
'dasdasdsafsvvfd gvdfvg dfvgd'

【讨论】:

  • 我可以建议自动修复正则表达式转义并防止贪婪匹配,这可能会导致删除大量您不想删除的文本:pattern = '%s(.*?)%s' % (re.escape(start), re.escape(end)) 答案 = re.sub(pattern, '', st)
  • @KennyOstrom 是的,干得好!这更笼统。
  • 如果子字符串多次出现,此解决方案将不起作用。例如,在“%name1% likes %name2%”中,解决方案需要返回“name1”和“name2”。相反,它返回“name1% likes %name2”
【解决方案3】:

这将删除字符串中的所有匹配项

import re

s = "dasdasdsafs[image : image name : image]vvfd gvdfvg dfvgd"
s = re.sub(r'\[image :.*?: image\]', r'', s)

【讨论】:

    【解决方案4】:

    明显的问题是您不能只插入任意字符串,因为它包含的字符会改变 re 的外观。相反,您想转义开始和结束字符串。当然,这次你可以通过输入正确的转义码来手动修复它们,但如果有一种简单的方法让 python 库为你做这件事并处理任何值会更好。

    import re
    start = re.escape("[image : ")
    end   = re.escape(" : image]")
    st = "dasdasdsafs[image : image name : image]vvfd gvdfvg dfvgd"
    result = re.search('%s(.*)%s' % (start, end), st).group(1)
    print result
    

    【讨论】:

    • 对不起,我误解了这个问题。他希望文本不在此匹配项中。 (虽然转义仍然是一个好主意,即使那样)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多