我有一批我需要削减的字符串.它们基本上是一个描述符,后跟代码.我只想保留描述符.
'a descriptor dps 23 fd'
'another 23 fd'
'and another fd'
'and one without a code'
Run Code Online (Sandbox Code Playgroud)
上面的代码是dps,23和fd.它们可以以任何顺序出现,彼此无关,可能根本不存在(如在最后一种情况下).
代码列表是固定的(或者至少可以预测),因此假设代码从未在合法描述符中使用,如何在代码的第一个实例之后剥离所有内容.
我正在使用Python.
Mar*_*off 24
简短的回答,正如@ THC4K在评论中指出:
string.split(pattern, 1)[0]
Run Code Online (Sandbox Code Playgroud)
string你的原始字符串在哪里,pattern是你的"破解"模式,1表示分裂不超过1次,并且[0]意味着获取分割返回的第一个元素.
在行动:
>>> s = "a descriptor 23 fd"
>>> s.split("23", 1)[0]
'a descriptor '
>>> s.split("fdasfdsafdsa", 1)[0]
'a descriptor 23 fd'
Run Code Online (Sandbox Code Playgroud)
这是表达我之前所写内容的一种更短的方式,无论如何我将保留在这里.
如果你需要删除多个模式,这是reduce内置的一个很好的候选者:
>>> string = "a descriptor dps foo 23 bar fd quux"
>>> patterns = ["dps", "23", "fd"]
>>> reduce(lambda s, pat: s.split(pat, 1)[0], patterns, string)
'a descriptor '
>>> reduce(lambda s, pat: s.split(pat, 1)[0], patterns, "uiopuiopuiopuipouiop")
'uiopuiopuiopuipouiop'
Run Code Online (Sandbox Code Playgroud)
这基本上是说:每个pat在patterns:采取string和重复应用string.split(pat, 1)[0](如上面所解释的),每次上先前所返回值的结果运行.如您所见,如果字符串中没有任何模式,则仍会返回原始字符串.
最简单的答案是列表/字符串切片与string.find:
>>> s = "a descriptor 23 fd"
>>> s[:s.find("fd")]
'a descriptor 23 '
>>> s[:s.find("23")]
'a descriptor '
>>> s[:s.find("gggfdf")] # <-- look out! last character got cut off
'a descriptor 23 f'
Run Code Online (Sandbox Code Playgroud)
一个更好的方法(避免在s.find返回-1 时切掉丢失模式中的最后一个字符)可能是一个简单的函数:
>>> def cutoff(string, pattern):
... idx = string.find(pattern)
... return string[:idx if idx != -1 else len(string)]
...
>>> cutoff(s, "23")
'a descriptor '
>>> cutoff(s, "asdfdsafdsa")
'a descriptor 23 fd'
Run Code Online (Sandbox Code Playgroud)
该[:s.find(x)]语法是指采取从索引为0的串,直至结肠的右手侧的部分; 在这种情况下,RHS是结果s.find,它返回您传递的字符串的索引.
| 归档时间: |
|
| 查看次数: |
25252 次 |
| 最近记录: |