2016-08-01 30 views
1

我有一个可能的分隔符列表。我正在处理几千个字符串,并且在找到其中一个分隔符后需要删除所有内容。注意:当字符串中有多个分隔符时,将永远不会有这种情况。剥离可能的分隔符列表之后的所有内容,而不使用正则表达式

实施例:

patterns = ['abc', 'def'] 
example_string = 'hello world abc 123' 

如果example_string是在这种情况下,输入,输出应该是hello world abc

我目前正在使用正则表达式的解决方案,这是工作,但我想使用一种不使用正则表达式的方法。这是我目前的执行:

regex = r'(.*)(' + '|'.join(patterns) + r')(.*)' 
example_string= re.sub(regex, r'\1\2', example_string).lstrip() 

我想沿着搜索线的东西,看是否从模式的分隔符的一个字符串中,然后从分隔符的长度的位置索引字符串,直到字符串的结尾。

不确切地知道这是否是一个很好的实现方法,或者如果这可行。

+0

“patterns”中大概有多少个字符串?他们都是一样的长度? –

+0

模式中有28个字符串,但随时间而变化。不,弦的长度各不相同。 – Harrison

+0

在这种情况下,您的基于正则表达式的方法可能会比任何非正则表达式解决方案更好。 –

回答

3

您可以使用find函数。使用

patterns = ['abc', 'def'] 
    example_string = 'hello world abc 123' 
    for pattern in patterns: 
     location = example_string.find(pattern) 
     if location >= 0: 
      example_string = example_string[:location + len(pattern)] 
      print example_string 
      break 
2

:这里每个图案(通过将图案的长度,如在实施例或图案的末端位置)检查,如果找到的字符串在所述模式的开始位置切片找到梅索德

string.find(S,子[,开始[,结束]])

返回最低索引在S其中子串子被发现使得子被完全包含在s中[开始:结束。失败时返回-1。开始和结束的默认值以及负值的解释与切片相同。

的检查结果是S [:结束]

3

可以滥用列表中理解和切片:

delimiters = ['a', 'b'] 
s = 'nvcakl' 
s = [s[:s.index(i) + 1] for i in delimiters if i in s] 
print(s) 
>> ['nvca'] 

这样即使不止一个分隔符找到了工作,在输出列表中的每个指标将对应于找到的分隔符,例如:

delimiters = ['a', 'b'] 
s = 'nvcaklbh' 
s = [s[:s.index(i) + 1] for i in delimiters if i in s] 
print(s) 
>> ['nvca', 'nvcaklb'] 
+0

如果发现有多于一个分隔符的奇怪机会,我希望字符串在首次出现分隔符时被剥离。这仍然是一个理想的解决方案吗? – Harrison

+0

OP的分隔符是不同长度的字符串,所以'+ 1'通常不起作用。此外,该算法即使在找到匹配项后也会测试所有分隔符。 –

+0

@ PM2Ring这是一个粗略的想法,将'+ 1'改为'+ len(i)' – DeepSpace

相关问题