如何删除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),也不需要指定“ 5
” 和string“ 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]
切片由firstIndex
和lastIndex
之间的所有元素组成,包括firstIndex
和lastIndex
。 如果省略了第一个索引,则默认为序列的开头。 如果省略了最后一个索引,则它将包括直到序列中最后一个元素的所有元素。 负指数也是允许的。 使用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]