如何删除string的左边部分?

我有一些简单的Python代码search文件的string,例如path=c:\path ,其中c:\path可能会有所不同。 目前的代码是:

 def findPath( 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=之后获取string文本的简单方法是什么? 有没有简单的方法,没有封闭,reflection或其他深奥的东西?

如果string是固定的,你可以简单地使用:

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

它给你从string中的位置5开始的所有东西(string也是一个序列,所以这些序列运算符也在这里工作)。

或者你可以在第一个分割线=

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

然后参数是“path”,值是第一个=之后的其余值。

从string中删除前缀

 # ... 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 

用ConfigParserparsingINI文件

 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()

一般来说,对于切片(有条件的或无条件的),我更喜欢最近同事提出的build议。 用空stringreplace。 更容易阅读代码,减less代码(有时),减less指定错误字符数量的风险。 好; 我不使用Python,但在其他语言中我更喜欢这种方法:

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

或者 – 跟进对这篇文章的第一条评论 – 如果这只应该如果行开始Path

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

与上面提出的一些主要区别在于没有涉及“幻数”(5),也不需要指定“ 5string“ Path= ”,换句话说,我更喜欢这种方法代码维护的观点。

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

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

 value = line.split("Path=", 1)[1] param, value = line.split("Path=", 1) 
 def removePrefix(text, prefix): return text[len(prefix):] if text.startswith(prefix) else text 

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

或者为什么不呢

 if line.startswith(prefix): return line.replace(prefix, '', 1) 
 >>> import re >>> p = re.compile(r'path=(.*)', re.IGNORECASE) >>> path = "path=c:\path" >>> re.match(p, path).group(1) 'c:\\path' 

我能想到的最简单的方法是切片 –

 def findPath( i_file): lines = open( i_file ).readlines() for line in lines: if line.startswith( "Path=" ) : return line[5:] 

关于切片符号的快速注释,它使用两个索引,而不是通常的索引。 第一个索引指示要包含在切片中的序列的第一个元素,最后一个索引是紧接在切片中包含的最后一个元素之后的索引。
例如:

 sequenceObj[firstIndex:lastIndex] 

切片由firstIndexlastIndex之间的所有元素组成,包括firstIndexlastIndex 。 如果省略了第一个索引,则默认为序列的开头。 如果省略了最后一个索引,则它将包括直到序列中最后一个元素的所有元素。 负指数也是允许的。 使用Google进一步了解该主题。

另一个在这里没有提到的简单单线程:

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

这也适用于各种边缘情况:

 >>> print("prefixfoobar".split("foo", 1)[-1]) "bar" >>> print("foofoobar".split("foo", 1)[-1]) "foobar" >>> print("foobar".split("foo", 1)[-1]) "bar" >>> print("bar".split("foo", 1)[-1]) "bar" >>> print("".split("foo", 1)[-1]) "" 

怎么样..

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

这个三元组是头部,分隔符和尾部 。

 line[5:] 

在第一个五个之后给你字符。

line[5:]会给你想要的子串。 search引言并找“切片符号”

我想这是你正在寻找的东西

  def findPath(i_file) : lines = open( i_file ).readlines() for line in lines : if line.startswith( "Path=" ): output_line=line[(line.find("Path=")+len("Path=")):] return output_line 

如果你知道列表parsing:

 lines = [line[5:] for line in file.readlines() if line[:5] == "Path="] 

stream行版本不太正确。 我想你想要:

 >>> print('foofoobar'.split('foo', 1).pop()) foobar 

不用写一个函数,就会按照列表进行分割,在这种情况下,'先生|博士|夫人',在[1]分割后select所有的东西,然后再分割并抓取任何元素。 在下面的情况下,返回“莫里斯”。

 re.split('Mr.|Dr.|Mrs.', 'Mr. Morgan Morris')[1].split()[1]