当前位置:  开发笔记 > 编程语言 > 正文

如何删除字符串的左侧部分?

如何解决《如何删除字符串的左侧部分?》经验,为你挑选了7个好方法。

我有一些简单的python代码搜索文件中的字符串,例如path=c:\path,c:\path可能会有所不同.目前的代码是:

def find_path(i_file):
    lines = open(i_file).readlines()
    for line in lines:
        if line.startswith("Path="):
            return # what to do here in order to get line content after "Path=" ?

之后获取字符串文本的简单方法是什么Path=?有没有简单的方法,没有封闭,反射或其他深奥的东西?



1> MrTopf..:

如果字符串是固定的,您可以简单地使用:

if line.startswith("Path="):
    return line[5:]

它提供了从字符串中的位置5开始的所有内容(字符串也是一个序列,所以这些序列操作符也在这里工作).

或者您可以在第一行拆分=:

if "=" in line:
    param, value = line.split("=",1)

然后param是"Path",值是第一个=后的其余部分.


就像Dan Olson所说的那样,如果分隔符不存在,`split`会抛出异常.`partition`更稳定,它也分割一个字符串,*always*返回一个带有pre,delimiter和post-content的三元素元组(如果分隔符不存在,其中一些可能是'''`).例如,`value = line.partition('=')`.
分割方法的+1,避免了len(前缀)上手动切片的轻微丑陋.

2> jfs..:

从字符串中删除前缀

# ...
if line.startswith(prefix):
   return line[len(prefix):]

在第一次出现分隔符时分割 str.partition()

def findvar(filename, varname="Path", sep="=") :
    for line in open(filename):
        if line.startswith(varname + sep):
           head, sep_, tail = line.partition(sep) # instead of `str.split()`
           assert head == varname
           assert sep_ == sep
           return tail

使用ConfigParser解析类似INI的文件

from ConfigParser import SafeConfigParser
config = SafeConfigParser()
config.read(filename) # requires section headers to be present

path = config.get(section, 'path', raw=1) # case-insensitive, no interpolation

其他选择

str.split()

re.match()



3> fredarin..:

对于切片(有条件或无条件),我更喜欢同事最近建议的内容; 使用空字符串替换.更容易阅读代码,更少的代码(有时)和更少的指定错误字符数的风险.好; 我不使用Python,但在其他语言中我更喜欢这种方法:

rightmost = full_path.replace('Path=', '', 1)

或者-跟进到这个主题的第一个注释-如果此只应如果行开始Path:

rightmost = re.compile('^Path=').sub('', full_path)

上面提到的一些主要区别在于没有涉及"神奇数字"(5),也没有必要同时指定' 5' 字符串' Path=',换句话说,我更喜欢这种代码维护方法观点看法.


这不符合以"Path ="开头的字符串的原始要求.

4> David Foster..:
def remove_prefix(text, prefix):
    return text[len(prefix):] if text.startswith(prefix) else text

无法抗拒这一行.需要Python 2.5+.



5> Thomas Schre..:

我更喜欢pop索引[-1]:

value = line.split("Path=", 1).pop()

value = line.split("Path=", 1)[1]
param, value = line.split("Path=", 1)


没有“幻数”的不错选择。值得注意的是,这是可行的,因为已经对“ startswith”进行了测试,因此“ split”将在“之前”和“之后”之间进行除法。`split(“ Path =”,1)`更精确(如果前缀在字符串的后面出现),但是会重新引入一个幻数。

6> John Damen..:

或者为什么不呢

if line.startswith(prefix):
    return line.replace(prefix, '', 1)



7> Floggedhorse..:

怎么样..

>>> line = r'path=c:\path'
>>> line.partition('path=')
('', 'path=', 'c:\\path')

这个三联体是头部,分离器和尾部.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有