我有一些简单的python代码可以搜索文件中的字符串,例如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=
之后获取字符串文本的简单方法是什么?
有没有简单的方法,没有封闭,反射或其他深奥的东西?
答案 0 :(得分:171)
如果字符串已修复,您只需使用:
if line.startswith("Path="):
return line[5:]
它提供了从字符串中的位置5开始的所有内容(字符串也是一个序列,所以这些序列操作符也在这里工作)。
或者您可以在第一个=
分割该行:
if "=" in line:
param, value = line.split("=",1)
然后param是“Path”,值是第一个=后的其余部分。
答案 1 :(得分:110)
# ...
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
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
答案 2 :(得分:39)
从Python 3.9
开始,您可以使用removeprefix
:
'Path=helloworld'.removeprefix('Path=')
# 'helloworld'
答案 3 :(得分:19)
对于切片(有条件或无条件),我更喜欢最近同事建议的内容;使用空字符串替换。更容易阅读代码,更少的代码(有时)和更少的指定错误字符数的风险。好;我不使用Python,但在其他语言中我更喜欢这种方法:
rightmost = full_path.replace('Path=', '', 1)
或 - 跟进此帖子的第一条评论 - 如果只有,如果该行与Path
一起完成:
rightmost = re.compile('^Path=').sub('', full_path)
上面提到的一些主要区别在于没有涉及“幻数”(5),也没有必要同时指定'5
'和字符串'Path=
',换句话说,从代码维护的角度来看,我更喜欢这种方法。
答案 4 :(得分:16)
def remove_prefix(text, prefix):
return text[len(prefix):] if text.startswith(prefix) else text
无法抗拒这一行。需要Python 2.5 +。
答案 5 :(得分:14)
我更喜欢pop
索引[-1]
:
value = line.split("Path=", 1).pop()
到
value = line.split("Path=", 1)[1]
param, value = line.split("Path=", 1)
答案 6 :(得分:9)
或者为什么不
if line.startswith(prefix):
return line.replace(prefix, '', 1)
答案 7 :(得分:5)
怎么样..
>>> line = r'path=c:\path'
>>> line.partition('path=')
('', 'path=', 'c:\\path')
这个三元组是head, separator, and tail。
答案 8 :(得分:3)
我能想到的最简单的方法是切片 -
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了解有关该主题的更多信息。
答案 9 :(得分:3)
>>> import re
>>> p = re.compile(r'path=(.*)', re.IGNORECASE)
>>> path = "path=c:\path"
>>> re.match(p, path).group(1)
'c:\\path'
答案 10 :(得分:2)
这里没有提到的另一个简单的单线:
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])
""
答案 11 :(得分:1)
line[5:]
在前五个字符后给你字符。
答案 12 :(得分:1)
removeprefix()
和removesuffix()
解释相关的问题,在 Python 3.9 中添加了 lstrip
和rstrip
字符串方法。阅读PEP 616了解更多详情。
# in python 3.9
>>> s = 'python_390a6'
# apply removeprefix()
>>> s.removeprefix('python_')
'390a6'
# apply removesuffix()
>>> s = 'python.exe'
>>> s.removesuffix('.exe')
'python'
# in python 3.8 or before
>>> s = 'python_390a6'
>>> s.lstrip('python_')
'390a6'
>>> s = 'python.exe'
>>> s.rstrip('.exe')
'python'
removesuffix
带有列表的示例:
plurals = ['cars', 'phones', 'stars', 'books']
suffix = 's'
for plural in plurals:
print(plural.removesuffix(suffix))
输出:
car
phone
star
book
removeprefix
带有列表的示例:
places = ['New York', 'New Zealand', 'New Delhi', 'New Now']
shortened = [place.removeprefix('New ') for place in places]
print(shortened)
输出:
['York', 'Zealand', 'Delhi', 'Now']
答案 13 :(得分:1)
pop版本不太对劲。我想你想要:
>>> print('foofoobar'.split('foo', 1).pop())
foobar
答案 14 :(得分:1)
line[5:]
将提供您想要的子字符串。搜索introduction并查找“切片表示法”
答案 15 :(得分:0)
我想这就是你正在寻找的东西
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
答案 16 :(得分:0)
没有写一个函数,这将根据列表进行拆分,在这种情况下'先生|博士|太太',用[1]拆分后选择所有内容,然后再拆分并抓住任何元素。在下面的例子中,'Morris'被退回。
re.split('Mr.|Dr.|Mrs.', 'Mr. Morgan Morris')[1].split()[1]
答案 17 :(得分:0)
为什么不使用带有转义的正则表达式?
^
匹配行的初始部分,每行匹配re.MULTILINE
个匹配项。 re.escape
确保匹配完全正确。
>>> print(re.sub('^' + re.escape('path='), repl='', string='path=c:\path\nd:\path2', flags=re.MULTILINE))
c:\path
d:\path2
答案 18 :(得分:0)
这在技术上与其他答案非常相似,但是没有重复的字符串操作,能够分辨前缀是否存在,并且仍然很可读:
parts = the_string.split(prefix_to_remove, 1):
if len(parts) == 2:
# do things with parts[1]
pass
答案 19 :(得分:0)
尝试以下代码
if line.startswith("Path="): return line[5:]
答案 20 :(得分:0)
如果您了解列表推导:
lines = [line[5:] for line in file.readlines() if line[:5] == "Path="]
答案 21 :(得分:-1)
可以尝试以下方法。
def remove_suffix(string1, suffix):
length = len(suffix)
if string1[0:length] == suffix:
return string1[length:]
else:
return string1
suffix = "hello"
string1 = "hello world"
final_string = remove_suffix(string1, suffix)
print (final_string)